2016-03-02 47 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

相关问题