2008-10-28 24 views
8

我正在玩C#3.0的新东西,我有这个代码(主要取自MSDN),但我只能得到真,假,真...而不是实际值:Linq/lambda关于.Select的问题(新学习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与Numbers <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); 
    } 

“选择”的方法是创建拉姆达结果的新列表的每个元素(真/假)。 “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); 
+0

Thx它的工作原理,如果不选择数据,选择什么? – 2008-10-28 01:32:27

+1

它确实选择了数据。它选择你的lambda的结果 - 这是一个布尔值。 – 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 。

感谢微软为这个可怕的命名