努力用LINQ理解Lambda表达式[关闭]

5lhxktic  于 2023-05-04  发布在  其他
关注(0)|答案(5)|浏览(151)

**已关闭。**此问题正在寻求书籍、工具、软件库等的建议。它不符合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);
}

}
我读了很多关于它如何工作的信息,但我不能只是让我的头周围如何'词'可以开始指的是单词列表中的项目。
有谁能帮我用简单的术语来解释一下,这样我就可以开始理解了。
谢谢

sbtkgmzw

sbtkgmzw1#

那条线

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

使用所谓的lambda表达式,这是一个独立于Linq的概念。可以通过使用单独的函数来实现相同的功能

public static int function(string word)
{
    return word.Length;
}

并如下使用它。

var sortedWords = words.OrderBy(function);

lambda表达式word => word.Length要短得多,并且定义了一个类似的内联函数。在这个公式中,word(在左边)定义了参数的名称。

hec6srdp

hec6srdp2#

我读了很多关于它如何工作的信息,但我不能只是让我的头周围如何'词'可以开始指的是单词列表中的项目。
OrderByIEnumerable<T>的一个扩展方法,IEnumerable<T>就是你的单词列表。
OrderBy可以枚举元素本身,因为它知道wordsIEnumerable<T>类型。
但是OrderBy需要一个“keySelector”来让它知道你想按什么来排序。keySelector是委托类型。这应该接受一个参数并返回一些东西(MSDN称之为“从元素中提取键的函数”)。

word => word.Length

word是参数,word.Length是方法体。
所以你要取单词,然后返回它的长度。

sbtkgmzw

sbtkgmzw3#

我将尝试使用一开始帮助我理解lambdas的概念。让我们看看lambda:

word => word.Length

这是(word) => word.Length的简写,而(word) => {return word.Length;}又是(word) => {return word.Length;}的简写
这个lambda反过来是匿名函数 * 的缩写,具有类型推断 *,因此下面只是伪代码:

delegate(var word) {return word.Length;}

编译器可以推断var的类型,因此在 Your example 中,这是以下的简写:

delegate(string word) {return word.Length;}

这反过来又是以下内容的简写(再次推断输出类型,因此这是特定于您的示例的):

static class [compilerInventMeAClassNamePlease] 
    {
       static int [compilerInventMeAMethodNamePlease] (string word) 
       {
          return word.Length;
       }
    }
...
    [a call to][compilerInventMeAMethodNamePlease]

这些类和方法实际上是由编译器创建的。
因此,lambda是一种 * 内联 * 创建匿名类/方法的方法,您没有给出名称并定义它。=>左边的所有内容都是签名。当你对它越来越熟悉时,你可能会发现用手写体格式写它们更容易,至少在最初是这样的:

(string word, int multiply) => { return word.Length * multiply;  }

请注意,lambda生成的类可能不是静态的,而是一个真实的的示例类,它有自己的示例字段,这是由于一个叫做闭包的概念,当你熟悉lambda表达式时,这是下一个要研究的东西

unftdfkk

unftdfkk4#

可以将“word”看作是传递给对元素进行排序的函数的参数。
对序列中的元素进行排序需要什么呢?首先,您需要一个标准,为序列中的任何给定元素确定它是否应该在后续元素之前。通常你会通过一个函数来定义它,因为一个函数可以接受任意数量的元素/参数,并“状态”/返回“一个单一的肯定/事情”关于它收到的输入元素。在我们的例子中,一个sort函数,在接收到两个元素时,会说在对元素排序时,第一个元素是否应该在第二个元素之前。
在定义了这样的标准之后,您需要检查每个元素,并根据排序标准(如上所述)检查当前元素是否应该排在下一个元素之前。
这就是为什么框架提供了一个接收函数的Sort方法。它将为您循环遍历每个序列元素,并检查排序条件的结果,然后根据结果对元素进行排序。

wsxa1bj1

wsxa1bj15#

'word'如何开始引用单词列表中的项目
检查以下方法签名:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

所以它是IEnumerable<TSource>的扩展方法。它需要一个Func<TSource, TKey>类型的参数,该参数本身就是一个委托,这就是为什么你要提供一个匿名函数作为参数的原因:(word) => { word.Length; }。程序知道word与集合words中的某个项的类型相同,因为wordTSource类型的参数,而TSource与方法OrderBy()扩展的this IEnumerable<TSource> source的类型相同。

相关问题