Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: So sánh kiểu dữ liệu tự định nghĩa <T> trong C#

  1. #1
    Ngày gia nhập
    10 2010
    Bài viết
    3

    Mặc định So sánh kiểu dữ liệu tự định nghĩa <T> trong C#

    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
    Code:
    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();
            }
        }
    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ệm

    P/S: cái class BubbleSort zới class Tong_Hop nằm ở 2 namesapce khác nhau

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Trên hành tinh thứ ba tính từ Mặt trời
    Bài viết
    202

    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

  3. #3
    Ngày gia nhập
    10 2010
    Bài viết
    3

    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

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    <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:
    1.  if (Array[j - 1] > Array[j])
    2.                     {
    3.                         HoanVi(Array[j - 1], Array[j]);
    4.                     }

    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

  5. #5
    Ngày gia nhập
    08 2009
    Bài viết
    98

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Trên hành tinh thứ ba tính từ Mặt trời
    Bài viết
    202

    Mặc định So sánh kiểu dữ liệu tự định nghĩa <T> trong C#

    Trích dẫn Nguyên bản được gửi bởi arkantos128 Xem bài viết
    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
    Giả sử mình đã có class sau:
    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);
        }  
    }
    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.
    Microsoft Student Partner
    University of Information Technology - VNUHCM
    Visit my blog: My power is my mind

  7. #7
    Ngày gia nhập
    07 2009
    Nơi ở
    Tp.HCM
    Bài viết
    238

    @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.

  8. #8
    Ngày gia nhập
    08 2010
    Bài viết
    44

    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?

  9. #9
    Ngày gia nhập
    06 2011
    Bài viết
    93

    Nếu vậy bạn dùng Comparer<T>.Default.Compare cũng được

    Visual C# Code:
    1. public class BubbleSort<T>
    2.     {
    3.         private void HoanVi(ref T x, ref T y)
    4.         {
    5.             T temp;
    6.             temp = x;
    7.             x = y;
    8.             y = temp;
    9.         }
    10.  
    11.         public void Sort(ref T[] Array)
    12.         {
    13.             int arrayLength = Array.Length;
    14.             for (int i = 0; i < arrayLength; i++)
    15.             {
    16.                 for (int j = arrayLength - 1; j > i; j--)
    17.                 {
    18.                     //if (Array[j - 1] > Array[j])
    19.                     //{
    20.                     //    HoanVi(Array[j - 1], Array[j]);
    21.                     //}
    22.                     if (Comparer<T>.Default.Compare(Array[j - 1], Array[j]) > 0)
    23.                     {
    24.                         HoanVi(ref Array[j - 1], ref Array[j]);
    25.                     }
    26.                 }
    27.             }
    28.         }
    29.     }

Các đề tài tương tự

  1. Xu thế thay đổi nghành công nghệ thông tin trong nước
    Gửi bởi anhduongtalents trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 1
    Bài viết cuối: 11-06-2012, 09:06 AM
  2. Đề xuất Đề nghị xóa bài viết "Suy nghĩ của 1 lập trình viên" trong mục KN
    Gửi bởi Trinh_lam93 trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 9
    Bài viết cuối: 28-01-2012, 12:23 AM
  3. Công nghệ mới giúp ứng dụng tinh nghệ trong ngăn ngừa và điều trị ung thư
    Gửi bởi vesim trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-08-2011, 02:39 PM
  4. Tuổi nghề của người trong ngành công nghệ phần mềm???
    Gửi bởi vuduykhanh trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 19
    Bài viết cuối: 11-03-2010, 04:58 PM
  5. Các nghề trong lĩnh vực Công nghệ Thông tin.
    Gửi bởi tinlouis trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 3
    Bài viết cuối: 25-05-2009, 02:22 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn