Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用LINQ努力理解Lambda表达式_C#_Linq_Lambda - Fatal编程技术网

C# 用LINQ努力理解Lambda表达式

C# 用LINQ努力理解Lambda表达式,c#,linq,lambda,C#,Linq,Lambda,我对这一点非常陌生,我无法理解我在网上看到的例子。我一直在尝试使用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):

我对这一点非常陌生,我无法理解我在网上看到的例子。我一直在尝试使用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);
}
}

我已经阅读了很多关于它是如何工作的信息,但我不能仅仅了解“单词”是如何开始引用单词列表中的项目的

有谁能帮我简单地说一下,这样我就可以开始理解它了

谢谢。

将“word”视为传递给对元素进行排序的函数的参数

对序列中的元素进行排序需要什么?首先,您需要一个标准,为序列中的任何给定元素确定它是否应该在后续元素之前。通常,您将通过一个函数来定义它,因为函数可以接受任意数量的元素/参数,并且“状态”/“返回”关于它接收到的输入元素的“一个确认/事情”。在我们的例子中,一个排序函数在接收到两个元素时,会说在对元素排序时,第一个元素是否应该在第二个元素之前

定义了这样的条件之后,您需要检查每个元素,并根据排序条件(如上所述)检查当前元素是否应该在序列排序中位于下一个元素之前

这就是框架为您提供接收函数的排序方法的原因。它将为您完成在每个序列元素上循环的工作,并检查排序标准的结果,并在此基础上对元素进行排序

线路

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
(位于左侧)定义参数的名称

我已经阅读了很多关于它是如何工作的信息,但我不能仅仅了解“单词”是如何开始引用单词列表中的项目的

OrderBy是
IEnumerable
的扩展方法,这就是您的单词列表。 OrderBy可以枚举元素本身,因为它知道
words
的类型是
IEnumberable
然而,OrderBy需要一个“keySelector”来让它知道您要按什么进行订购。keySelector是委托类型。这应该获取一个参数并返回一些内容。(MSDN将其称为“从元素中提取键的函数”。)

word是参数,word.Length是方法体


因此,您将获取单词,然后返回其长度。

我将尝试使用这个概念,首先帮助我了解lambdas。让我们看看lambda:

word => word.Length
这是
(word)=>word.Length
的缩写,而
(word)=>{return word.Length;}

此lambda又是具有类型推断的匿名函数的缩写,因此以下仅为伪代码:

delegate(var word) {return word.Length;}
编译器可以推断var的类型,因此在您的示例中,这是以下内容的简称:

delegate(string word) {return word.Length;}
这又是(同样推断出输出类型,因此这是特定于您的示例的)的缩写:

这些类和方法实际上是由编译器生成的

因此,lambda是一种内联创建匿名类/方法的方法,您没有给出名称并定义它。
=>
左侧的所有内容都是签名。当您对它感到满意时,您可能会发现,至少在开始时,以长手格式编写它们会更容易:

(string word, int multiply) => { return word.Length * multiply;  }
请注意,lambda生成的类可能不是静态的,而是一个具有自己实例字段的真实实例类,这是由于一个称为闭包的概念,当您熟悉lambda时,下一步要研究闭包

“单词”如何开始引用单词列表中的项目

检查方法签名,该签名为:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)
公共静态IORDerenumerable OrderBy(
这是一个数不清的来源,
Func键选择器
)

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

在lambda语句中,前面的项=>是一个变量声明,您可以将任何内容放在那里,它将转换为列表类型的变量。不是教程服务,您需要关于代理的教程。lambda只是一种很容易创建方法和委托的方法。另外,在询问之前,您似乎没有进行足够的尝试和研究。我真的不同意这里的“策略”。一个家伙来问一个问题,这个网站的用户应该来给答案或者至少是指导。那些不想这样做的人可以自由地不这样做。但坚持这种纯粹主义是荒谬的。这是一个网络资源,为那些来寻求帮助的人提供帮助。这可能并不总是可能的,也不总是合适的,但要求研究或学习某个主题的海报并不妨碍他有资格在这里提问。@Richard是的,正如你所说,meta是讨论这个问题的合适地方,而不是在这里。但是在非常具体的主题上,当lambda被添加到C#时,我个人使用了大量委托,我对lambda语法的理解有点困惑。。。是的:没有什么我不能通过仔细阅读官方文件和一些文件来解决的
(string word, int multiply) => { return word.Length * multiply;  }
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)