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的 答案 。