2016-03-02 70 views
3

我創建一個擴展方法:Func鍵<T, TResult>接入參數

public static IEnumerable<T> GroupAndSortBy<T>(this IEnumerable<T> source) 

我想從任何收藏此方法:

myCollection.GroupAndSortBy(x => x.MyParam) 

如果MyParam必須是一個字符串,因爲我想在字母分組的方法中使用它。

這樣做,我的方法簽名改成這樣:

public static IEnumerable<T> GroupAndSortBy<T>(this IEnumerable<T> source, Func<T, string> key) 

的問題是,現在我不能訪問我傳遞的參數實際的字符串,但我想這樣做像這樣:

source.GroupBy(key.ToLower().FirstOrDefault()); 

你能幫我嗎?

+0

爲什麼你需要'.FirstOrDefault()'? –

+0

試試這個'source.GroupBy(x => key(x).ToLower())' –

+0

你爲什麼期望結果是'IEnumerable '?如果將項目組合在一起,那麼結果將是一組組,而不是一組單個項目。你能解釋你的目標嗎? –

回答

4

由於key是一個代表,你應該調用它,這樣的:

source.GroupBy(t => key(t).ToLower().FirstOrDefault()); 

這告訴LINQ,爲了獲得從源值t類型的T一個需要調用組密鑰,將其轉換爲小寫,並抓住第一個字母,如果有的話。

注:你並不需要將整個密鑰轉換爲較低的情況下,如果你想要的是第一個字母:

source.GroupBy(t => char.ToLower(key(t).FirstOrDefault())); 
+0

你是完全正確的。每天工作10h很重要!謝謝:) – xTuMiOx

+0

@xTuMiOx你是對的,每天只工作10h太放鬆:-) :-) – dasblinkenlight

+0

哪裏是'key'的定義? (對'Func'概念有新意] –

0

key是一個函數(委託)返回一個字符串,所以你必須把它從它那裏得到的字符串返回值:

source.GroupBy(key().ToLower().FirstOrDefault()); 
3

你可以做這樣的事情:

var query = source.GroupBy(x => key(x).ToLower()); 

我不清楚爲什麼你需要FirstOrDefault。你只想使用第一個字符嗎?

+0

'FirstOrDefault'有抓住第一個字母的地方。 – dasblinkenlight

+0

@dasblinkenlight,這就是它的作用,但是我發現OP會想要這樣做讓人感到奇怪。也許他正在使用它我的錯誤。 –

+0

我認爲他想要做的就是按首字母進行分組。 – dasblinkenlight

相關問題