2008-10-28 54 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 。

感謝微軟爲這個可怕的命名