2011-04-08 61 views
2

首先讓我說我不確定這個問題的標題是否有意義,但我不確定如何說出我的問題。在Func/lambda表達式中重複使用方法調用

我有一個類定義爲

public static class NaturalSort<T> 

這個類有一個方法

public static IEnumerable<T> Sort(IEnumerable<T> list, Func<T, String> field) 

基本上它執行假定返回值進行排序函數求一些列表上的自然排序。我一直在使用它來做任何我想做的事情。

通常我會做這樣的事情

sorted = NaturalSort<Thing>.sort(itemList, item => item.StringValueToSortOn) 

現在我有我想要的排序依據的值不是項目的場的情況下,卻是一些方法

通話像

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item)) 

現在如果我getValue返回一個對象,而不是一個字符串。我需要做一些有條件的邏輯去我的字符串值

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item).Something == null ? getValue(item).SomethingElse : getValue(item).SomeotherThing) 

這工作,除調用的getValue是昂貴的,我不想把它的3倍。有什麼方法可以在表達式中調用它嗎?

回答

5

是的,lambda可以有多行代碼。

item => 
{ 
    var it = getvalue(item); 
    return it.Something == null ? it.SomethingElse : it.SomeotherThing; 
} 

確保如果使用的是Func<T>代表你在這個語法返回一個值,而這在短期語法隱式地處理,你必須自己做,在多行的語法。

此外,你應該讓你的Sort方法的擴展方法,你也不必類型參數的類,只需使用

public static IEnumerable<T> Sort<T>(this IEnumerable<T> list, Func<T, String> field) 
0

@Femaref是100%,我只是想知道,爲什麼你不會有

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item)) 
     .Select(item => item.Something == null ? item.SomethingElse : item.SomeotherThing) 
+0

,由於的getValue(項目)不返回一個字符串 – Erix 2011-04-08 14:25:31

+0

他希望通過'item'成員排序是無效的走,因此需要該成員在排序通話。 – Femaref 2011-04-08 14:51:18

+0

doh。它出於某種原因在我的頭上,這是對拉姆達的改造。別介意我瘋狂的談話... – jasper 2011-04-08 15:40:31