我是公司的新人,使用C#(我用过其他语言),我刚刚在代码中遇到了一个Lambda表达式,所以我试图理解这是怎么回事有效,但对the Microsoft website的解释远非明确:
static void Main(string[] args)
{
string[] digits = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };
Console.WriteLine("Example that uses a lambda expression:");
var shortDigits = digits.Where((digit, index) => digit.Length < index);
foreach (var sD in shortDigits)
{
Console.WriteLine(sD);
}
}
在查看&#34;数字&#34;的定义时,我只看到内容,但我无法理解为什么index
确实是字符串的索引。让我通过something
替换该变量的名称来解释我的意思:
static void Main(string[] args)
{
string[] digits = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };
Console.WriteLine("Example that uses a lambda expression:");
var shortDigits = digits.Where((digit, something) => digit.Length < something);
foreach (var sD in shortDigits)
{
Console.WriteLine(sD);
}
}
=&GT;我怎么知道something
的含义是索引而不是strings[]
的另一个属性?
相关问题:我可以在此变量列表中添加更多内容(为什么/为什么不添加)?
static void Main(string[] args)
{
string[] digits = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };
Console.WriteLine("Example that uses a lambda expression:");
var shortDigits = digits.Where((digit, var1, var2, ...) => digit.Length < var1);
foreach (var sD in shortDigits)
{
Console.WriteLine(sD);
}
}
=&GT;这似乎没有编译,有语法错误,有以下消息:Delete 'Func<string,bool>' does not take 3 arguments
。为什么bool
? index
不是布尔值,而是整数。我错过了什么?
答案 0 :(得分:8)
在查看&#34;数字&#34;的定义时,我只看到内容,但我无法理解为什么索引确实是字符串的索引。
这是因为Where
被过度使用了。
index
是lambda表达式中的参数 - lambda表达式正在转换为Func<string, int, bool>
。
从documentation from this overload of Where
,predicate
参数:
测试条件的每个源元素的函数;函数的第二个参数表示源元素的索引。
参数值由调用委托的代码提供。
您无法随意决定lambda表达式有多少参数 - 您必须提供一个lambda表达式,该表达式可以转换为指定为Where
方法参数的委托类型。您可以只有一个参数(对于值)或两个(对于值和索引),因为该方法已重载。