8

我正在玩 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);
        }

我该如何解决这个问题以显示整数列表?

4

2 回答 2

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);
    }

“选择”方法正在为每个元素(真/假)创建一个新的 lambda 结果列表。“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);
于 2008-10-28T01:30:21.437 回答
5
numbers.Select(n => n % 2 == 1);

将此更改为

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

select 所做的是将一件事“转换”为另一件事。所以在这种情况下,它是“转换” n 到“n % 2 == 1”(这是一个布尔值)——因此你得到了所有的真假。

它通常用于获取事物的属性。例如,如果您有一个Person对象列表,并且想要获取它们的名称,您会这样做

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

你可以这样想:

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

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

感谢微软糟糕的命名

于 2008-10-28T01:33:47.233 回答