C# Func<;T、 TResult>;访问参数

C# Func<;T、 TResult>;访问参数,c#,C#,我正在创建一个扩展方法: public static IEnumerable<T> GroupAndSortBy<T>(this IEnumerable<T> source) 其中MyParam必须是字符串,因为我想在字母分组的方法中使用它 执行此操作时,我应将方法签名更改为: public static IEnumerable<T> GroupAndSortBy<T>(this IEnumerable<T> source

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

public static IEnumerable<T> GroupAndSortBy<T>(this IEnumerable<T> source)
其中MyParam必须是字符串,因为我想在字母分组的方法中使用它

执行此操作时,我应将方法签名更改为:

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

您能帮助我吗?

您的
键是一个返回字符串的函数(委托),因此您必须调用它以从中获取字符串返回值:

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

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

source.GroupBy(key.ToLower().FirstOrDefault());
source.GroupBy(t => key(t).ToLower().FirstOrDefault());
var query = source.GroupBy(x => key(x).ToLower());
这告诉LINQ,为了从类型为
t
的源值
t
获取组键,需要调用
key(t)
,将其转换为小写,并抓取第一个字母(如果有)

注意:如果只需要第一个字母,则无需将整个键转换为小写:

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

您可以这样做:

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

我不清楚为什么需要
first或default
。是否仅使用第一个字符?

为什么需要
.FirstOrDefault()
?请尝试此
源代码.GroupBy(x=>key(x).ToLower())
为什么希望结果是
IEnumerable
?如果将项目分组在一起,则结果将是一组组,而不是一组单个项目。你能解释一下你的目标吗?FirstOrDefault只是为这个问题添加的,实际上我不需要它。结果是IEnumerable,但同样,这只是一个问题,在我的实际代码中是不同的。谢谢大家!
FirstOrDefault
是用来抓取第一个字母的。@dasblinkenlight,它就是这样做的,但我觉得OP想要这样做很奇怪。也许他用它是我的错误。我想他所要做的就是按照第一个字母分组。问题是要让x=>key(x)起作用,我完全忘了它是一个委托。我其实不需要FirstOrDefault,它只是为了这个问题。非常感谢。你完全正确。每天工作10小时是一种压力!谢谢:)@xtumix你说得对,一天只工作10小时太放松了:-):-):-)键的定义在哪里?(对
Func
concept有点新)@Giorgi它在OP的代码中:将第三个代码段一直向右滚动。委托类型已定义。@Giorgi OP要执行此操作:
var res=myList.GroupAndSortBy(person=>person.Name)
,其中
person=>person.Name
在调用中变为
Func
。当
GroupAndSortBy
调用
key(person)
LINQ最终调用
person.Name