2010-10-02 28 views
9

Không có chức năng Sort() cho IList. Someoene có thể giúp tôi với điều này? Tôi muốn sắp xếp IList của riêng mình.Tôi làm cách nào để sắp xếp IList <Class>?

Giả sử đây là IList tôi:

public class MyObject() 
{ 
public int number { get; set; } 
public string marker { get; set; } 
} 

Làm thế nào để loại myObj bằng cách sử dụng chuỗi điểm đánh dấu?

public void SortObject() 
{ 
IList<MyObject> myobj = new List<MyObject>(); 
} 
+1

'Myobj' luôn là' Danh sách'? Nếu vậy, bạn có thể truyền nó vào một 'Danh sách' và chạy hàm' Sắp xếp' của nó. – Gabe

Trả lời

16

Sử dụng OrderBy

Ví dụ

public class MyObject() 
{ 
    public int number { get; set; } 
    public string marker { get; set; } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker).ToList(); 

Đối với một trường hợp không nhạy cảm, bạn nên sử dụng một IComparer

public class CaseInsensitiveComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     return string.Compare(x, y, StringComparison.OrdinalIgnoreCase); 
    } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker, new CaseInsensitiveComparer()).ToList(); 
+0

Cảm ơn @Bruno điều này giúp ích. – Rye

+1

+1 để xem xét phân biệt chữ hoa chữ thường, nhưng Khung đã có so sánh chuỗi phân biệt chữ hoa chữ thường, không cần phải tạo. Hãy thử StringComparer.OrdinalIgnoreCase thay vì CaseInsensitiveComparer của bạn. – Joe

0
var sorted = myObj.OrderBy(x => x.marker); 
0

OrderBy chắc chắn được công việc làm, nhưng cá nhân tôi thích cú pháp của List.Sort vì bạn có thể cho nó một đại biểu Comparison<T> thay vì phải viết một lớp thực hiện IComparer<T>. Chúng tôi có thể thực hiện được mục tiêu đó với một phương pháp mở rộng, và nếu đó là một cái gì đó bạn quan tâm, hãy kiểm tra SortExtensions:

http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

9

tôi sẽ đi chống sử dụng OrderBy với một danh sách bởi vì nó là một phương pháp khuyến nông LINQ , do đó:

  • Nó bao bọc danh sách trong một số, sau đó liệt kê danh sách và điền vào danh sách tạm thời mới, sau đó sắp xếp danh sách mới này.
  • Nó bao bọc danh sách được sắp xếp bên trong một danh sách khác.
  • Sau đó, khi bạn gọi ToList(), nó lặp lại trên đó và điền vào một danh sách mới khác với các mục.

Về bản chất: nó tạo và điền vào 2 danh sách mới và 2 liệt kê ngoài việc sắp xếp thực tế. Để so sánh, List.Sort() sắp xếp và tạo không có gì để nó hiệu quả hơn.

Khuyến cáo của tôi sẽ là:

  • Nếu bạn biết loại cơ bản, sử dụng List.Sort() hoặc Array.Sort(array)
  • Nếu bạn không biết loại cơ bản, sao chép danh sách vào một mảng tạm thời và sắp xếp nó bằng cách sử Array.Sort(array) và trả lại.
Các vấn đề liên quan