我正在创建一个扩展方法:
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());
你可以帮我吗?
由于key
是一个委托,你应该调用它,就像这样:
source.GroupBy(t => key(t).ToLower().FirstOrDefault());
这告诉 LINQ,为了从类型为 T
的源值t
获取组键,需要调用 key(t)
,将其转换为小写,并获取第一个字母(如果有)。
备注:如果您只需要第一个字母,则不需要将整个密钥转换为小写:
source.GroupBy(t => char.ToLower(key(t).FirstOrDefault()));
你可以做这样的事情:
var query = source.GroupBy(x => key(x).ToLower());
我不清楚你为什么需要FirstOrDefault
.是否只想使用第一个字符?
你的key
是一个返回字符串的函数(委托),所以你必须调用它才能从中获取字符串返回值:
source.GroupBy(key().ToLower().FirstOrDefault());