C#newbie:如何知道lambda表达式中变量的含义

时间:2017-10-27 08:16:02

标签: c# lambda

我是公司的新人,使用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。为什么boolindex不是布尔值,而是整数。我错过了什么?

1 个答案:

答案 0 :(得分:8)

  

在查看&#34;数字&#34;的定义时,我只看到内容,但我无法理解为什么索引确实是字符串的索引。

这是因为Where被过度使用了。

index是lambda表达式中的参数 - lambda表达式正在转换为Func<string, int, bool>

documentation from this overload of Wherepredicate参数:

  

测试条件的每个源元素的函数;函数的第二个参数表示源元素的索引。

参数值由调用委托的代码提供。

您无法随意决定lambda表达式有多少参数 - 您必须提供一个lambda表达式,该表达式可以转换为指定为Where方法参数的委托类型。您可以只有一个参数(对于值)或两个(对于值和索引),因为该方法已重载。