Linq / lambda pregunta sobre .Select (newby learning 3.0)
Pregunta
Estoy jugando con lo nuevo de C # 3.0 y tengo este código (tomado en su mayoría de MSDN ) pero solo puedo obtener true, false, true ... y no el 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);
}
¿Cómo puedo solucionarlo para mostrar la lista de enteros?
Solución
Cambia tu " Seleccionar " a " Donde "
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);
}
El " Seleccionar " El método es crear una nueva lista del resultado lambda para cada elemento (verdadero / falso). El " Donde " El método es el filtrado basado en la lambda.
En C #, también puede utilizar esta sintaxis, que puede encontrar más clara:
var oddNumbers = from n in numbers
where n % 2 == 1
select n;
que el compilador traduce a:
var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
Otros consejos
numbers.Select(n => n % 2 == 1);
Cambia esto a
numbers.Where(n => n % 2 == 1);
Lo que hace la selección es " convertir " una cosa a otra Entonces, en este caso, es " Convertir " n a " n% 2 == 1 " (que es un booleano) - por lo tanto, obtienes todo lo verdadero y falso.
Generalmente se usa para obtener propiedades sobre cosas. Por ejemplo, si tuvieras una lista de objetos Person
y quisieras obtener sus nombres, lo harías
var listOfNames = listOfPeople.Select( p => p.Name );
Puedes pensar en esto así:
- Convierta la lista de personas en una lista de cadenas, usando el siguiente método: (p = > p.Name)
Para " seleccionar " (en el " filtrado " de la palabra) un subconjunto de una colección, debe usar Where.
Gracias a Microsoft por la terrible denominación