2009-03-03 21 views

Trả lời

1

Bạn cần thiết lập trình so sánh cho biết sắp xếp() cách sắp xếp các mục.

Check-out List.Sort Method (IComparer) cho một ví dụ về làm thế nào để làm điều này ...

27

Sử dụng phương pháp sắp xếp và lambda biểu thức, nó là rất dễ dàng.

myList.Sort((a, b) => String.Compare(a.Name, b.Name)) 

Ví dụ trên cho biết cách sắp xếp theo thuộc tính Tên của loại đối tượng, giả sử Tên thuộc loại chuỗi.

+4

Mà sẽ nổ tung nếu a.Name là null ... –

+0

Bạn chỉ có thể sử dụng string.Compare (a.Name, b.Name), cái nào sẽ an toàn? –

+0

Cảm ơn! Tìm hiểu điều gì đó mới mỗi ngày ... Tôi sẽ chỉnh sửa câu trả lời. –

8

Nếu bạn chỉ muốn Sort() hoạt động, bạn sẽ cần phải triển khai IComparable hoặc IComparable<T> trong lớp học.

Nếu bạn không ngại tạo danh sách mới mới, bạn có thể sử dụng phương thức mở rộng OrderBy/ToList LINQ. Nếu bạn muốn sắp xếp danh sách hiện có với cú pháp đơn giản hơn, bạn có thể thêm một vài phương pháp mở rộng, cho phép:

list.Sort(item => item.Name); 

Ví dụ:

public static void Sort<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y))); 
} 
public static void SortDescending<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(y), selector(x))); 
} 
+0

Bạn có ví dụ về việc sử dụng các phương pháp mở rộng này không, tôi đã thử sử dụng câu hỏi của mình http://stackoverflow.com/questions/31057258/sort-list-of-dictionary-using-icomparer-instead-of-orderby, nhưng không thể không triển khai cách bạn đã đề xuất –

2
public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

List<Person> people = new List<Person>(); 

people.Sort(
    delegate(Person x, Person y) { 
     if (x == null) { 
      if (y == null) { return 0; } 
      return -1; 
     } 
     if (y == null) { return 0; } 
     return x.FirstName.CompareTo(y.FirstName); 
    } 
); 
Các vấn đề liên quan