2010-01-23 41 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表示相等,正值表示大於。