Bạn có thể kế thừa các lớp T từ interface IComparable, sau đó sử dụng phương thức CompareTo trên kiểu dữ liệu đó thay vì sử dụng phép toán >, ngoài ra bạn có thể overload toán tử > trong kiểu dữ liệu mới.
Thân,
Hiện tại em đang làm lại giải thuật Bubble sort trong C# và đã chạy tốt với mảng kiểu int. Vấn đề là bây giờ em không muốn cố định kiểu dữ liệu của mảng, mà kiểu dữ liệu của mảng sẽ do người dùng tự chọn, vd: int, float... và em chọn dùng kiểu thay thế <T> nhưng lại gặp vấn đề ở chỗ so sánh. Ai biết cách sửa chỉ giùm em với
ngay cái dòng if(Array[j-1]>Array[j]) thì bị báo lỗi là operator '>' cannot be applied to operands type 'T' and 'T'. Ai biết chỉ giùm em cách sửa để em rút kinh nghiệmCode:public class BubbleSort<T> { private void HoanVi(T x, T y) { T temp; temp = x; x = y; y = temp; } public void Sort(T[] Array) { int arrayLength = Array.Length; for (int i = 0; i < arrayLength; i++) { for (int j = arrayLength - 1; j > i; j--) { if (Array[j - 1] > Array[j]) { HoanVi(Array[j - 1], Array[j]); } } } } } class Program { static void Main(string[] args) { Random random = new Random(); int[] Array = new int[100]; BubbleSort<int> sort = new BubbleSort<int>(); for (int i = 0; i < 10; i++) Array[i] = random.Next(0, 20); for (int i = 0; i < 10; i++) Console.Write("{0}\t", Array[i]); Console.WriteLine(); sort.Sort(Array); for (int i = 0; i < 10; i++) Console.Write("{0}\t", Array[i]); Console.ReadLine(); } }
P/S: cái class BubbleSort zới class Tong_Hop nằm ở 2 namesapce khác nhau
Bạn có thể kế thừa các lớp T từ interface IComparable, sau đó sử dụng phương thức CompareTo trên kiểu dữ liệu đó thay vì sử dụng phép toán >, ngoài ra bạn có thể overload toán tử > trong kiểu dữ liệu mới.
Thân,
Microsoft Student Partner
University of Information Technology - VNUHCM
Visit my blog: My power is my mind
Mình có vào trang MSDN để xem về interface IComparable nhưng vẫn không nắm rõ lắm cách sử dụng của nó. Bạn có thể cho mình 1 ví dụ nào ko. Còn cái overload toán tử '<' mà bạn nói bạn có thể chỉ mình luôn ko.
Cám ơn bạn nhìu
<T> là generic chứ ko phải là kiểu người dùng tự định nghĩa, nó giống khái niệm template trong C++
Cái đoạn code của cậu
Visual C# Code:
{ HoanVi(Array[j - 1], Array[j]); }
Nếu implement T là 1 class hay kiểu string thì làm sao so sánh dc. Cậu phải add constraint cho nó hoặc kế thừa IComparable.
Còn demo thì google đấy
Cánh Chym ứ mỏi
http://msdn.microsoft.com/en-us/library/cfttsh47.aspx
Đầy đủ và chi tiết
Giả sử mình đã có class sau:
Khi đó bạn có thể sử dụng phép so sánh > cho kiểu T (nếu T là Person) hoặc sử dụng CompareTo.Code:class Person:IComparable<Person> { public int Age{get; set} public int CompareTo(Nguoi rhs) { return this.Age.CompareTo(rhs.Age); } public static bool operator > (Nguoi lhs, Nguoi rhs) { return (lhs.Age > rhs.Age); } }
Microsoft Student Partner
University of Information Technology - VNUHCM
Visit my blog: My power is my mind
@xuanchien: Ví dụ của bạn T có kiểu reference thì hem nói. Cái này quá rõ ràng rồi. chỉ xài được cho mỗi ông person.
Nhưng chủ pic có cái vd về T là kiểu value type (đáng lẽ chủ pic nên chỉ rõ T cho mọi người không nhầm lẫn).
Về mặc định thì các kiểu value type đều có compare sẵn rồi nhưng khi dùng các toán tử so sánh thì nó toàn báo lỗi.
Mình tìm hiểu thì thấy chỉ có phép so sánh bằng hoặc khồng bằng (nhưng không được dùng toán tử ==, !=) mà phải dùng hàm để so sánh thôi.
Khi bạn cầm trên tay một món hàng Trung Quốc là bạn đang giúp Trung Quốc có thêm những viên đạn, những khẩu súng để bắn vào người Việt Nam.
mình ko biết về kiểu này, nhưng có thể ép kiểu đc ko?
hoặc check xem T đó kiểu gì rồi làm?
Nếu vậy bạn dùng Comparer<T>.Default.Compare cũng được
Visual C# Code:
{ { T temp; temp = x; x = y; y = temp; } { { { //if (Array[j - 1] > Array[j]) //{ // HoanVi(Array[j - 1], Array[j]); //} { } } } } }