Linq / pergunta lambda sobre .Select (newby aprendendo 3.0)
Pergunta
Eu estou jogando com o novo material de C # 3.0 e eu tenho esse código (principalmente tomadas a partir MSDN ), mas eu só pode obter verdadeiro, falso, verdadeiro ... e não o valor real:
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);
}
Como posso corrigir isso para mostrar a lista de inteiro?
Solução
Mude o seu "Select" para um "Onde"
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);
}
O método de "Select" é a criação de uma nova lista do resultado lambda para cada elemento (true / false). O "Onde" método é a filtragem baseada na lambda.
Em C #, você também pode usar essa sintaxe, o que você pode encontrar mais claro:
var oddNumbers = from n in numbers
where n % 2 == 1
select n;
que o compilador traduz em:
var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
Outras dicas
numbers.Select(n => n % 2 == 1);
Alterar isso para
numbers.Where(n => n % 2 == 1);
O que seleccionar faz é "convertido" uma coisa para outra. Portanto, neste caso, é "Conversão" n para "n% 2 == 1" (que é um boolean) - daí você começa todo o verdadeiro e os falsos
. É geralmente usado para obter propriedades sobre as coisas. Por exemplo, se você tivesse uma lista de objetos Person
, e você queria para obter seus nomes, você faria
var listOfNames = listOfPeople.Select( p => p.Name );
Você pode pensar desta maneira:
- Converter a lista de pessoas em uma lista de strings, utilizando o seguinte método: (p => p.Name)
Para "selecione" (na "filtragem" sentido da palavra) um subconjunto de uma coleção, você precisa usar Onde.
Graças Microsoft para o terrível nomeação