如何按C#中的特定字段对对象列表进行排序?

我有这堂课:

public class StatInfo { public string contact; public DateTime date; public string action; } 

然后我有一个StatInfo列表,但我不确定如何根据日期字段对其进行排序。 我应该使用排序方法吗? 我应该创建自己的吗?

 var _allStatInfo = new List(); // adding lots of stuff in it _allStatInfo.SortByDate??? 

无需编写大量代码(如果可能),最好的方法是什么?

谢谢

使用LINQ:

 var sortedList = _allStatInfo.OrderBy(si => si.date).ToList(); 

对原始列表进行排序:

 _allStatInfo.Sort(new Comparison((x, y) => DateTime.Compare(x.date, y.date))); 

无论如何,我看到你已经得到了答案,但……

  1. 只需将声明分成两半即可避免一些丑陋:

     Comparison comparison = (x, y) => DateTime.Compare(x.date, y.date); _allStatInfo.Sort(comparison); 

    您可能还想考虑直接调用CompareTo

     Comparison comparison = (x, y) => x.date.CompareTo(y.date); _allStatInfo.Sort(comparison); 
  2. 您可以使用我的ProjectionComparer类创建IComparer实现 – 它是MiscUtil的一部分,我在此答案的底部包含了一个未注释的版本。 然后你写:

     _allStatInfo.Sort(ProjectionComparer.Create(x => x.date)); 
  3. 即使你使用的是.NET 2.0,你仍然可以通过LINQBridge使用LINQ。

这是第二个答案所需的ProjectionComparer类。 前几个类实际上只是帮助通用类型推理更好地工作。

 public static class ProjectionComparer { public static ProjectionComparer Create (Func projection) { return new ProjectionComparer(projection); } public static ProjectionComparer Create (TSource ignored, Func projection) { return new ProjectionComparer(projection); } } public static class ProjectionComparer { public static ProjectionComparer Create (Func projection) { return new ProjectionComparer(projection); } } public class ProjectionComparer : IComparer { readonly Func projection; readonly IComparer comparer; public ProjectionComparer(Func projection) : this (projection, null) { } public ProjectionComparer(Func projection, IComparer comparer) { projection.ThrowIfNull("projection"); this.comparer = comparer ?? Comparer.Default; this.projection = projection; } public int Compare(TSource x, TSource y) { // Don't want to project from nullity if (x==null && y==null) { return 0; } if (x==null) { return -1; } if (y==null) { return 1; } return comparer.Compare(projection(x), projection(y)); } } 

为了说明Robert C. Cartaino的答案:

 public class StatInfo : IComparable { public string contact; public DateTime date; public string action; public int CompareTo(StatInfo value) { return this.date.CompareTo(value.date); } } var _allStatInfo = new List(); // this now sorts by date _allStatInfo.Sort(); 

不是最通用的解决方案,但如果您只按日期排序则很好。 而且,正如Robert所说,您仍然可以通过将IComparer参数传递给sort方法来覆盖默认排序。

使用lambda表达式将一对映射到比较:

 _allStatInfo.Sort((x, y) => x.date - y.date); 

对于DateTime,不需要进行比较。

 _allStatInfo.OrderyBy(d => d.date); 

要么

 _allStatInfo.OrderByDescending(d => d.Date); 

它适用于我使用委托排序自定义类型的数组

 // sort array by name Array.Sort(users, delegate(User user1, User user2) { return user1.Name.CompareTo(user2.Name); }); // write array (output: Betty23 Lisa25 Susan20) foreach (User user in users) Console.Write(user.Name + user.Age + " ");