关于Linq / lambda的问题。选择(newby learn 3.0)

时间:2008-10-28 01:29:02

标签: linq c#-3.0 lambda

我正在玩C#3.0的新内容,我有这个代码(主要来自MSDN),但我只能得到真,假,真......而不是真正的价值:

        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        var oddNumbers = numbers.Select(n => n % 2 == 1);

        Console.WriteLine("Numbers < 5:");
        foreach (var x in oddNumbers)
        {
            Console.WriteLine(x);
        }

如何修复此问题以显示整数列表?

2 个答案:

答案 0 :(得分:25)

将“选择”更改为“位置”

    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

    var oddNumbers = numbers.Where(n => n % 2 == 1);

    Console.WriteLine("Odd Number:");
    foreach (var x in oddNumbers)
    {
        Console.WriteLine(x);
    }

“Select”方法正在为每个元素创建一个新的lambda结果列表(true / false)。 “Where”方法基于lambda进行过滤。

在C#中,您也可以使用这种语法,您可以更清楚地看到它:

        var oddNumbers = from n in numbers
                         where n % 2 == 1
                         select n;

编译器转换为:

var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);

答案 1 :(得分:5)

numbers.Select(n => n % 2 == 1);

将此更改为

numbers.Where(n => n % 2 == 1);

什么选择将一件事“转换”为另一件事。所以在这种情况下,它是“转换”n到“n%2 == 1”(这是一个布尔值) - 因此你得到了所有的真实和谬误。

它通常用于获取物品的属性。例如,如果你有一个Person个对象的列表,并且你想得到他们的名字,你就可以

var listOfNames = listOfPeople.Select( p => p.Name );

你可以这样想:

  • 使用以下方法将人员列表转换为字符串列表:(p =&gt; p.Name)

要“选择”(在单词的“过滤”意义上)集合的子集,您需要使用Where。

感谢微软的糟糕命名