如何通过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)));
无论如何,我看到你已经得到了答案,但是…
-
你可以通过将声明分成两部分来避免一些丑陋:
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);
-
您可以使用我的
ProjectionComparer
类创build一个IComparer<T>
实现 – 它是MiscUtil的一部分,我在这个答案的底部包含了一个未注释的版本。 你会写:_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
-
即使你使用.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 + " ");