C#:使用匿名函数排序

假设我有一个对象列表,我想按项目DateModified属性对其进行排序。 为什么我不能像这样使用委托? 如果不是如下所示,我应该如何通过DateModified对它们进行排序:

public string SortByDateModified(List items) { items.Sort(new Func((itemA, itemB) => { return itemA.DateModified < itemB.DateModified; })); } 

为什么不使用lambda表达式?

 public string SortByDateModified(List items) { items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); } 

如果您不想使用lambdas或大于.NET 2.0,请使用以下命令:

 public string SortByDateModified(List items) { items.Sort(delegate(CartItem itemA, CartItem itemB) { return itemA.DateModified.CompareTo(itemB.DateModified); }); } 

根据我的经验,在Unity等环境中,lambdas甚至代理都可能导致崩溃或问题,尤其是在iOS等平台上。 在这种情况下,您可能希望使您的分拣机成为一个单独的function,如下所示:

 int SortCartItemFunction(CartItem itemA, CartItem itemB) { return itemA.DateModified.CompareTo(itemB.DateModified); } 

然后你可以将它传递给你的排序调用:

 items.Sort(SortCartItemFunction); 

Sort方法接受一个名为Comparison的委托。 你试图传入一个Func ,它本身就是一个委托。 委托Func和委托Comparison之间没有转换。

但是,您可以使用lambda表达式 。

 items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 

实际上,您使用这个非常lambda表达式并将其传递给Func构造函数*。 但是,没有必要。 lambda表达式可以转换为签名匹配的任何委托 – 即(a, b) => a.DateModified.CompareTo(b.DateModified)可以分配给类型为Func或类型的Comparison 。 在这种情况下,我们将其传递给期望Comparison

*只需一个小调整。 排序expectes一个整数作为返回类型。 负值表示小于,0表示相等,正值表示大于。

bool在这样的委托中没用,通常使用int ,因为你需要3个值来表示比较的结果,小于,等于和大于。 .NET集合通常(如果不总是)假设-1表示小于,0表示相等,1表示大于。

然后,在您的代理中,您必须检查值x是否小于,等于或大于值y。 这里要注意的一件有趣的事情是,如果你翻转结果,例如将y与x进行比较,你将按相反的方向排序。

有关对日期进行排序的最简单方法,请查看JohnC的答案 ,或Sam的 答案 。