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
。