C# 需要了解下面使用func的代码

C# 需要了解下面使用func的代码,c#,C#,我对代表们是新手。今天我看到了这上面的代码。由于我是c语言的新手,特别是对代表来说,我无法理解下面的代码 public static void Main() { Func<String, int, bool> predicate = (str, index) => str.Length == index; String[] words = { "orange", "apple", "Article", "elephant", "star", "a

我对代表们是新手。今天我看到了这上面的代码。由于我是c语言的新手,特别是对代表来说,我无法理解下面的代码

public static void Main()
   {
      Func<String, int, bool> predicate = (str, index) => str.Length == index;

      String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
      IEnumerable<String> aWords = words.Where(predicate).Select(str => str);

      foreach (String word in aWords)
         Console.WriteLine(word);
   }

上述代码的输出为星形。AS谓词期望传递参数,但在本例中,我们不传递任何参数。非常感谢您的评论。

首先,有一个函数定义:

 Func<String, int, bool> predicate = (str, index) => str.Length == index;
您将传递上述函数定义,其类似于:

words.Where((element, index) => element.Length == index).Select(str => str);
正如你所看到的,只有元素星符合这个标准,也就是说,星的长度是4,它的指数也是4

关于你的困惑:

AS谓词期望使用参数,但在本例中,我们不是 传递任何参数

请注意,对于LINQ,我们只指定实现细节中的what和how。因此,在前面提到的代码中,Where子句将把每个元素及其索引传递给谓词函数


另一方面,Select是多余的,只是IEnumerable aWords=words。Wherepredicate应该是shuffice。

首先,有一个函数定义:

 Func<String, int, bool> predicate = (str, index) => str.Length == index;
您将传递上述函数定义,其类似于:

words.Where((element, index) => element.Length == index).Select(str => str);
正如你所看到的,只有元素星符合这个标准,也就是说,星的长度是4,它的指数也是4

关于你的困惑:

AS谓词期望使用参数,但在本例中,我们不是 传递任何参数

请注意,对于LINQ,我们只指定实现细节中的what和how。因此,在前面提到的代码中,Where子句将把每个元素及其索引传递给谓词函数


另一方面,Select是多余的,只是IEnumerable aWords=words。Wherepredicate应该是shuffice。

让我们从第一行开始检查这段代码

Func<String, int, bool> predicate = (str, index) => str.Length == index;
这里我们只声明了一个名为predicate的变量,这是一种特殊的变量,它的值是一个函数,它接收两个类型为string和int的参数,并期望返回bool。但是这个功能的主体在哪里呢?就在等号后面。str、index是参数,主体只是参数str的长度与参数索引值之间的比较。 =>str.Length==如果条件匹配,则索引返回true,否则返回false

现在我们已经理解了委托人的声明,下一个问题是我们在哪里使用它。这就更简单了。我们可以在需要与委托匹配的函数时使用它


现在有一个重载,它只需要这个重载,所以我们可以简单地将谓词变量放在那个位置,并调用Where扩展名,让我们从第一行开始检查这段代码

Func<String, int, bool> predicate = (str, index) => str.Length == index;
这里我们只声明了一个名为predicate的变量,这是一种特殊的变量,它的值是一个函数,它接收两个类型为string和int的参数,并期望返回bool。但是这个功能的主体在哪里呢?就在等号后面。str、index是参数,主体只是参数str的长度与参数索引值之间的比较。 =>str.Length==如果条件匹配,则索引返回true,否则返回false

现在我们已经理解了委托人的声明,下一个问题是我们在哪里使用它。这就更简单了。我们可以在需要与委托匹配的函数时使用它


现在有一个重载,它期望的就是这个,所以我们可以简单地将谓词变量放在那个位置,并调用Where扩展名。简言之,代码只是说,选择长度等于索引的所有单词

string[] words = { "orange", "apple", "Article", "elephant", "star", "and" };

// select all words where the length equals the index
var aWords = words.Where((str, i) => str.Length == i);

foreach (var word in aWords)
   Console.WriteLine(word);
基于谓词筛选值序列。每个元素的 索引用于谓词函数的逻辑中

封装具有两个参数并返回值为的方法 TResult参数指定的类型

所以唯一的魔法就是Func

本质上,它只是一个委托,与操作不同,它能够返回一个值

委托是一种类型,它表示对具有 特定参数列表和返回类型。当您实例化 委托时,可以将其实例与具有 兼容的签名和返回类型。您可以调用或调用 方法通过委托实例


简而言之,代码只是说,选择长度等于索引的所有单词

string[] words = { "orange", "apple", "Article", "elephant", "star", "and" };

// select all words where the length equals the index
var aWords = words.Where((str, i) => str.Length == i);

foreach (var word in aWords)
   Console.WriteLine(word);
基于谓词筛选值序列。每个元素的 索引用于谓词函数的逻辑中

封装具有两个参数并返回值为的方法 TResult参数指定的类型

所以唯一的魔法就是Func

本质上,它只是一个委托,与操作不同,它能够返回一个值

委托是一种类型,它表示对具有 特殊参数l ist和返回类型。当您实例化 委托时,可以将其实例与具有 兼容的签名和返回类型。您可以调用或调用 方法通过委托实例

简单一点,

var aWords = words.Where(str => str.Length == 4);
同:

Func<string, bool> predicate = str => str.Length == 4;
var aWords = words.Where(predicate);
简单一点,

var aWords = words.Where(str => str.Length == 4);
同:

Func<string, bool> predicate = str => str.Length == 4;
var aWords = words.Where(predicate);

Wherepredicate是单词的缩写形式。Wherestr,index=>predicatestr,indexEnumerable.Where调用谓词函数并将元素和索引作为参数传递给它。搜索C MethodGroup。这里的谓词用作方法组。调用aWords时会记录该谓词,程序将使用条件谓词func检查word数组中的每个单词字符串,这将得到IEnumerable>结果。调用.Selectstr=>str时,筛选结果中的每个单词都将作为str参数执行,.words.Wherepredicate是单词的缩写形式。Wherestr,index=>predicatestr,indexEnumerable.Where调用谓词函数并将元素和索引作为参数传递给它。搜索C MethodGroup。这里的谓词用作方法组。调用aWords时会记录该谓词,程序将使用条件谓词func检查word数组中的每个单词字符串,这将得到IEnumerable>结果。当call.Selectstr=>str时,过滤结果中的每个单词都将作为str参数执行。OP最容易混淆的部分是如何将参数传递给委托。您应该提到,这是由Where方法完成的,除了参数如何发送到谓词的一部分之外,我对一切都很清楚?就像它会自动向谓词发送参数一样?@Aomine。谢谢现在我对上面提到的代码有了更好的了解。OP最让人困惑的部分是参数是如何传递给委托的。您应该提到,这是由Where方法完成的,除了参数如何发送到谓词的一部分之外,我对一切都很清楚?就像它会自动向谓词发送参数一样?@Aomine。谢谢现在我对所提到的代码有了更好的了解。