2010-01-23 110 views
22

假设我有一个对象列表,并且我想按项目DateModified属性进行排序。为什么我不能使用这样的委托?我应该如何通过DateModified排序这些如果不是,如下图所示:C#:使用匿名函数排序

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

我假设你缩短了演示的功能?因为它应该返回一个字符串,但不返回任何内容。 – 2010-01-23 03:47:45

+0

时间选择一个答案mistah :) – Skurmedel 2010-01-26 15:12:46

回答

47

为什么不使用lambda表达式?

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

绝对。杰夫的答案是*正确*,但* yuck *。拉姆达是非常干净。 – Aaronaught 2010-01-23 04:02:32

+1

一小笔记,你错过了一个' ':) – Skurmedel 2010-01-23 04:03:29

+0

Skurmedel,谢谢,我编辑了答案。 – 2010-01-23 04:25:00

14

如果你不希望使用.NET 2.0 lambda表达式或更高,使用此:

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

根据我的经验,在Unity等环境中,lambda表达式甚至代表可能导致崩溃或问题,特别是在像iOS这样的平台上。在这种情况下,你想使你的分选一个单独的函数,像这样:

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

然后,你可以把它传递给你的那种电话是这样的:

items.Sort(SortCartItemFunction); 
+0

1+但投票限制达到:( – Skurmedel 2010-01-23 04:00:18

0

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

然后,您将在您的代表中检查值x是小于,等于还是大于值y。这里需要注意的一点是,如果您翻转结果,例如将y与x比较,您将按相反方向排序。

要排序日期最简单的方法,请检查JohnC's answerSam's

11

Sort方法采用一种称为Comparison<T>委托。你试图通过一个Func<int, int, bool>,这本身就是一个代表。代表Func<int, int, bool>与代表Comparison<T>之间没有转换。您可以使用lambda expression

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

事实上,你用这个非常lambda表达式并把它传递到Func<int, int, bool>构造*。但是,没有必要。拉姆达表达式可以转换为任何签名匹配的代表 - 即(a, b) => a.DateModified.CompareTo(b.DateModified)可以分配给类型为Func<int, int, int>的东西或键入Comparison<T>的东西。在这种情况下,我们将它传递给期望Comparison<T>的东西。

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