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