C#:使用匿名函数排序

Jam*_*ead 24 c# sorting

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

public string SortByDateModified(List<CartItem> items)
{
    items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) =>
    {
        return itemA.DateModified < itemB.DateModified;
    }));
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*eff 53

Why not use a lambda expression?

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个警告 - 你必须瞄准.Net 3.5或更高版本.如果出于兼容性原因而定位到2.0,则必须使用委托答案. (3认同)

jjx*_*tra 15

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

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(delegate(CartItem itemA, CartItem itemB) 
    { 
        return itemA.DateModified.CompareTo(itemB.DateModified); 
    }); 
} 
Run Code Online (Sandbox Code Playgroud)

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

int SortCartItemFunction(CartItem itemA, CartItem itemB) 
{ 
    return itemA.DateModified.CompareTo(itemB.DateModified); 
} 
Run Code Online (Sandbox Code Playgroud)

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

items.Sort(SortCartItemFunction);
Run Code Online (Sandbox Code Playgroud)

  • 1+ 但已达到投票上限:( (2认同)

ICR*_*ICR 11

Sort方法需要一个名为的委托Comparison<T>.你试图传入一个Func<int, int, bool>,它本身就是一个委托.委托Func<int, int, bool>与代理之间没有转换Comparison<T>.

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

items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified));
Run Code Online (Sandbox Code Playgroud)

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

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