Linq / лямбда-вопрос о .Select (newby learning 3.0) - PullRequest
8 голосов
/ 28 октября 2008

Я играю с новым материалом C # 3.0 и у меня есть этот код (в основном взятый из MSDN ), но я могу получить только true, false, true ... а не реальное значение:

        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 ]

25 голосов
/ 28 октября 2008

Измените свой «Выбрать» на «Где»

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

Метод «Выбор» создает новый список лямбда-результата для каждого элемента (true / false). Метод «Где» - это фильтрация на основе лямбды.

В C # вы также можете использовать этот синтаксис, который может показаться вам более понятным:

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

который компилятор переводит на:

var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
5 голосов
/ 28 октября 2008
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)

Чтобы "выбрать" (в смысле "фильтрации") подмножество коллекции, вам нужно использовать Где.

Спасибо Microsoft за ужасное наименование

...