2012-03-15 47 views
6

Tôi có lớp này:Sắp xếp danh sách các đối tượng bằng cách tính C#

public class Leg 
{ 
    public int Day { get; set; } 
    public int Hour { get; set; } 
    public int Min { get; set; } 
} 

Tôi có một chức năng mà được một danh sách các chân, gọi là GetLegs()

List<Leg> legs = GetLegs(); 

Bây giờ tôi muốn sắp xếp danh sách này. Vì vậy, trước tiên tôi phải xem xét ngày, sau đó giờ, và cuối cùng là phút. Tôi nên giải quyết vấn đề này như thế nào?

Cảm ơn

+4

Tại sao bạn không sử dụng cấu trúc 'DateTime' gốc? So sánh và do đó phân loại được hỗ trợ ra khỏi hộp. Xem http://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx –

+1

Nhân tiện - hãy xem các câu hỏi liên quan ở bên phải - có rất nhiều chủ đề tương tự, bạn cần tìm hiểu để tìm kiếm một chút. Một ví dụ (đầu tiên tôi nhìn vào) ... http://stackoverflow.com/questions/3309188/c-net-how-to-sort-a-list-t-by-a-property-in-the -object – SkonJeet

+0

Như bạn thấy, đây là bài đăng đầu tiên của tôi ở đây, vì vậy tôi có thể sẽ quen với cách mọi thứ hoạt động;) Cảm ơn bạn đã trả lời, tôi không thể sử dụng DateTime trong trường hợp này. – Engern

Trả lời

10

Có lẽ một cái gì đó như thế này:

List<Leg> legs = GetLegs() 
       .OrderBy(o=>o.Day) 
       .ThenBy(o=>o.Hour) 
       .ThenBy(o=>o.Min).ToList(); 
1

Bạn có thể viết một tùy chỉnh IComparer<Leg> và vượt qua nó với phương pháp List<T>.Sort.

Hoặc, bạn có thể thực hiện IComparable<Leg> trong lớp học của mình và chỉ cần gọi List<T>.Sort.

+0

Không cần phải làm ngay cả điều đó, anh ta chỉ có thể viết một lambda ẩn danh trong 'Danh sách .Sort'. –

+2

Vì lý do tái sử dụng mã, việc triển khai 'IComparable ' có thể là giải pháp thay thế tốt hơn nếu phân loại/so sánh sẽ xảy ra tại nhiều vị trí. – Matthias

+0

đó là một điểm rất tốt. –

0

Tôi đoán điều này sẽ hữu ích.

var o = legs.OrderBy(x => x.Day) 
      .ThenBy(x => x.Hour) 
      .ThenBy(x => x.Min); 
0

Bạn cần phải thực hiện các giao diện IComparable<T> trên lớp của bạn để cho phép một cách trực quan hơn cho các đối tượng được sắp xếp trong ngôn ngữ C#. Khi một lớp thực hiện IComparable, bạn cũng phải thực hiện các lớp public methodCompareTo(T).

Leg thực hiện IComparable<Leg>, có nghĩa là một thể hiện Leg có thể được so sánh với Leg trường hợp khác.

#region "Leg Class that implements IComparable interface" 
    public class Leg:IComparable<Leg> 
    { 
     public int Day { get; set; } 
     public int Hour { get; set; } 
     public int Min { get; set; } 

     public int CompareTo(Leg leg) 
     { 
      if (this.Day == leg.Day) 
      { 
       if (this.Hour == leg.Hour) 
       { 
        return this.Min.CompareTo(leg.Min); 
       } 
      } 
      return this.Day.CompareTo(leg.Day); 
     } 
    } 
    #endregion 


    //Main code 
    List<Leg> legs = GetLegs(); 
    legs.Sort(); 
Các vấn đề liên quan