**已关闭。**此问题正在寻求书籍、工具、软件库等的建议。它不符合Stack Overflow guidelines。目前不接受答复。
我们不允许问题寻求书籍,工具,软件库等的建议。您可以编辑问题,以便可以用事实和引用来回答。
8年前关闭。
Improve this question
我对这个非常陌生,我无法理解我在网上看到的例子。我一直在尝试使用lambda语句对列表进行排序,就像我在网上找到的示例代码一样:
public void Linq29()
{
string[] words = { "cherry", "apple", "blueberry" };
var sortedWords = words.OrderBy(word => word.Length);
Log.WriteLine("The sorted list of words (by length):");
foreach (var w in sortedWords)
{
Log.WriteLine(w);
}
}
我读了很多关于它如何工作的信息,但我不能只是让我的头周围如何'词'可以开始指的是单词列表中的项目。
有谁能帮我用简单的术语来解释一下,这样我就可以开始理解了。
谢谢
5条答案
按热度按时间sbtkgmzw1#
那条线
使用所谓的lambda表达式,这是一个独立于Linq的概念。可以通过使用单独的函数来实现相同的功能
并如下使用它。
lambda表达式
word => word.Length
要短得多,并且定义了一个类似的内联函数。在这个公式中,word
(在左边)定义了参数的名称。hec6srdp2#
我读了很多关于它如何工作的信息,但我不能只是让我的头周围如何'词'可以开始指的是单词列表中的项目。
OrderBy
是IEnumerable<T>
的一个扩展方法,IEnumerable<T>
就是你的单词列表。OrderBy
可以枚举元素本身,因为它知道words
是IEnumerable<T>
类型。但是
OrderBy
需要一个“keySelector”来让它知道你想按什么来排序。keySelector
是委托类型。这应该接受一个参数并返回一些东西(MSDN称之为“从元素中提取键的函数”)。word是参数,word.Length是方法体。
所以你要取单词,然后返回它的长度。
sbtkgmzw3#
我将尝试使用一开始帮助我理解lambdas的概念。让我们看看lambda:
这是
(word) => word.Length
的简写,而(word) => {return word.Length;}
又是(word) => {return word.Length;}
的简写这个lambda反过来是匿名函数 * 的缩写,具有类型推断 *,因此下面只是伪代码:
编译器可以推断var的类型,因此在 Your example 中,这是以下的简写:
这反过来又是以下内容的简写(再次推断输出类型,因此这是特定于您的示例的):
这些类和方法实际上是由编译器创建的。
因此,lambda是一种 * 内联 * 创建匿名类/方法的方法,您没有给出名称并定义它。
=>
左边的所有内容都是签名。当你对它越来越熟悉时,你可能会发现用手写体格式写它们更容易,至少在最初是这样的:请注意,lambda生成的类可能不是静态的,而是一个真实的的示例类,它有自己的示例字段,这是由于一个叫做闭包的概念,当你熟悉lambda表达式时,这是下一个要研究的东西
unftdfkk4#
可以将“word”看作是传递给对元素进行排序的函数的参数。
对序列中的元素进行排序需要什么呢?首先,您需要一个标准,为序列中的任何给定元素确定它是否应该在后续元素之前。通常你会通过一个函数来定义它,因为一个函数可以接受任意数量的元素/参数,并“状态”/返回“一个单一的肯定/事情”关于它收到的输入元素。在我们的例子中,一个sort函数,在接收到两个元素时,会说在对元素排序时,第一个元素是否应该在第二个元素之前。
在定义了这样的标准之后,您需要检查每个元素,并根据排序标准(如上所述)检查当前元素是否应该排在下一个元素之前。
这就是为什么框架提供了一个接收函数的Sort方法。它将为您循环遍历每个序列元素,并检查排序条件的结果,然后根据结果对元素进行排序。
wsxa1bj15#
'word'如何开始引用单词列表中的项目
检查以下方法签名:
所以它是
IEnumerable<TSource>
的扩展方法。它需要一个Func<TSource, TKey>
类型的参数,该参数本身就是一个委托,这就是为什么你要提供一个匿名函数作为参数的原因:(word) => { word.Length; }
。程序知道word
与集合words
中的某个项的类型相同,因为word
是TSource
类型的参数,而TSource
与方法OrderBy()
扩展的this IEnumerable<TSource> source
的类型相同。