.Selectに関するLinq / lambdaの質問(newby learning 3.0)
質問
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);
}
整数のリストを表示するように修正するにはどうすればよいですか
解決
&quot;選択&quot;を変更します&quot; Where&quot;
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);
}
&quot;選択&quot;メソッドは、各要素のラムダ結果の新しいリストを作成しています(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);
他のヒント
numbers.Select(n => n % 2 == 1);
これを変更
numbers.Where(n => n % 2 == 1);
selectが行うことは&quot; convert&quot;ですあることから別のことへ。この場合、「変換中」ですnから「n%2 == 1」へ(これはブール値です)-したがって、すべての真と偽を取得します。
通常、物のプロパティを取得するために使用されます。たとえば、 Person
オブジェクトのリストがあり、その名前を取得したい場合は、次のようにします
var listOfNames = listOfPeople.Select( p => p.Name );
次のように考えることができます:
- 次のメソッドを使用して、人のリストを文字列のリストに変換します:(p =&gt; p.Name)
「選択」するには(「フィルタリング」という言葉の意味では)コレクションのサブセットには、Whereを使用する必要があります。
ひどいネーミングについてマイクロソフトに感謝します
所属していません StackOverflow