C# 需要了解下面使用func的代码
我对代表们是新手。今天我看到了这上面的代码。由于我是c语言的新手,特别是对代表来说,我无法理解下面的代码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
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。谢谢现在我对所提到的代码有了更好的了解。