gpt4 book ai didi

c# - 对 LINQ 参数感到困惑

转载 作者:太空狗 更新时间:2023-10-29 22:21:11 24 4
gpt4 key购买 nike

我正在尝试了解 LINQ 并自信地使用它。我正在努力解决的是要求的参数。示例:

var sortedWords = words.OrderBy(a=>a.Length)

words 是一个数组集合。 OrderBy 的 intellisense 说:

Func<string, TKey> keyselector

func 执行方法,string 是值,TKey 是键。

在例子中http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx#thenBySimple (ThenBy - 比较器),我们通过说 a => a.Length 来比较长度。我理解该语法,但它与智能感知的要求有什么关系?

由于所有泛型,我倾向于发现方法签名和智能感知不可读。

谢谢。

最佳答案

如果您了解 lambda expressions 的性质,该类型(由 Intellisense 显示)是有意义的在 .NET/C# 中。否则,对于新人来说,确实会显得有些陌生。首先考虑 keySelector 的类型 Func 只是一个委托(delegate)。在 C# 3.0 之前,您可以通过将委托(delegate)作为参数传递来调用此类方法,例如:

IEnumerable<string> sortedWords = words.OrderBy(new Func<string, int>(mySelectorMethod));

其中 mySelectorMethod 是一个普通方法的名称,它以 string 作为参数并返回 int。 (顺便说一下,我想你可以使用匿名委托(delegate),但我们现在先不去那里。)另外,请注意这个例子纯粹是说明性的,因为 LINQ 几乎总是与 .NET 3.5/C# 3.0 一起使用(尽管我相信它可以与 .NET 2.0/C# 2.0 之一/两者一起使用——如果我错了,请有人纠正我)。从 C# 3.0 开始,可以将方法内联定义为 lambda 表达式,这些表达式旨在准确地用于此类情况。如果您想获得适当的介绍,请阅读关于 lambda 表达式的 MSDN 文章(链接在上面),但在这里我将简单地描述在此特定上下文中的用法。如您所述,您的代码(在 C# 3.0 中)类似于以下内容:

var sortedWords = words.OrderBy(a => a.Length);

表达式中 a => a.Length 的部分是 lambda 表达式,它实际上只是声明内联函数的简写。大多数情况下,lambda 表达式的语法非常简单;在 => 的左侧指定参数,通常采用 (arg1, arg2, arg3) 的形式,但由于在这种情况下只有一个参数,因此可以省略括号。 => 右边是作为函数返回值的表达式(更准确地说是 lambda 表达式)。或者,您可以在 { 和 } 中使用 return 语句将实际代码括起来,尽管这通常是不必要的。我相信 C# 编译器所做的是将传递给 OrderBy 的参数识别为 lambda 表达式,然后将其编译为函数并为您创建并传递委托(delegate)。请注意,lambda 表达式也可以转换为 System.Linq.Expressions.Expression 对象(可访问的表达式树)而不是委托(delegate),但这种用法不太常见。无论如何,这里的幕后发生了很多事情,但希望这至少应该阐明为什么类型是 Func 以及它与 lambda 表达式的关系。正如我所说,如果您想更深入地了解 LINQ/lambdas/delegates,请阅读 MSDN...

关于c# - 对 LINQ 参数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com