如何通过C#中的特定字段对对象数组进行sorting?

我有这个class级:

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

那么我有一个StatInfo的列表,但我不知道如何根据date字段进行sorting。 我应该使用sorting方法吗? 我应该创build自己的?

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

这样做的最好方法是不必写很多代码(如果可能的话)?

谢谢

使用LINQ:

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

sorting原始列表:

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

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

  1. 你可以通过将声明分成两部分来避免一些丑陋:

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

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

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

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

这是第二个答案所需的ProjectionComparer类。 头几个类真的只是助手,让genericstypes推理更好地工作。

 public static class ProjectionComparer { public static ProjectionComparer<TSource, TKey> Create<TSource, TKey> (Func<TSource, TKey> projection) { return new ProjectionComparer<TSource, TKey>(projection); } public static ProjectionComparer<TSource, TKey> Create<TSource, TKey> (TSource ignored, Func<TSource, TKey> projection) { return new ProjectionComparer<TSource, TKey>(projection); } } public static class ProjectionComparer<TSource> { public static ProjectionComparer<TSource, TKey> Create<TKey> (Func<TSource, TKey> projection) { return new ProjectionComparer<TSource, TKey>(projection); } } public class ProjectionComparer<TSource, TKey> : IComparer<TSource> { readonly Func<TSource, TKey> projection; readonly IComparer<TKey> comparer; public ProjectionComparer(Func<TSource, TKey> projection) : this (projection, null) { } public ProjectionComparer(Func<TSource, TKey> projection, IComparer<TKey> comparer) { projection.ThrowIfNull("projection"); this.comparer = comparer ?? Comparer<TKey>.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)); } } 

使用lambdaexpression式将一对映射到比较:

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

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

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

不是最一般的解决scheme,但如果你只是按datesorting,那么这个解决scheme很好。 而且,正如Robert所说,通过将IComparerparameter passing给sort方法,仍然可以始终覆盖默认sorting。

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

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

要么

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

它为我工作使用委托sorting自定义types的数组

 // 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 + " ");