我正在创建一个扩展方法:
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 :(得分: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());