Func <t,tresult =“”>访问参数

时间:2016-03-02 14:22:40

标签: c#

我正在创建一个扩展方法:

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());

你能帮助我吗?

3 个答案:

答案 0 :(得分:4)

由于key是委托,您应该调用,如下所示:

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

这告诉LINQ,为了从类型为t的源值T获取组密钥,需要调用key(t),将其转换为小写,然后抓取第一个信,如果有的话。

注意:如果您想要的只是第一个字母,则无需将整个密钥转换为小写字母:

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

答案 1 :(得分:3)

您可以这样做:

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

我不清楚为什么你需要FirstOrDefault。你想只使用第一个字符吗?

答案 2 :(得分:0)

你的key是一个返回字符串的函数(委托),所以你必须调用它来从中获取字符串返回值:

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