2008-10-28 2 views
8

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

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

Как исправить это, чтобы показать список целых чисел?

+0

Кажется, n% 2 == 1 не имеет ничего общего с числами <5? – 2013-12-09 07:23:57

ответ

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» метод создает новый список результатов лямбда для каждого элемента (истина/ложь). Метод «Где» фильтруется на основе лямбда.

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

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

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

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

Thx это работает, что выбрать, если он не выбирает данные? – 2008-10-28 01:32:27

+1

Он выбирает данные. Он выбирает результат вашей лямбды - это логическое значение. – TheSoftwareJedi 2008-10-28 01:34:17

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 => p.Name)

Чтобы «выбрать» (в смысле «фильтрации» слова) подмножество коллекции, вам необходимо использовать Where ,

Спасибо Microsoft за страшное именование