2008-10-28 24 views
8

Estoy jugando con las cosas nuevas de C# 3.0 y tengo este código (principalmente tomado de MSDN) pero solo puedo obtener verdadero, falso, cierto ... y no el valor real:Pregunta de Linq/lambda sobre. Seleccione (newby learning 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); 
     } 

¿Cómo puedo solucionar eso para mostrar la lista de números enteros?

+0

Parece que n% 2 == 1 no tiene nada que ver con Números <5? –

Respuesta

25

Cambiar la "Seleccionar" a un "Dónde"

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 método "Seleccionar" es la creación de una nueva lista de los resultados para cada elemento lambda (verdadero/falso). El método "Dónde" se está filtrando en base a la lambda.

En C#, también se podría utilizar esta sintaxis, que se puede encontrar más clara:

 var oddNumbers = from n in numbers 
         where n % 2 == 1 
         select n; 

la que el compilador traduce en:

var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n); 
+0

Thx funciona, ¿para qué sirve Select si no selecciona datos? –

+1

Selecciona datos. Está seleccionando el resultado de su lambda, que es un valor booleano. – TheSoftwareJedi

+0

thx !! Ahora lo entiendo. –

5
numbers.Select(n => n % 2 == 1); 

Cambiar esto

numbers.Where(n => n % 2 == 1); 

Lo que hace la selección es "convertir" una cosa en otra. Entonces, en este caso, se trata de "Convertir" n en "n% 2 == 1" (que es un booleano), por lo que obtienes todos los verdaderos y los falsos.

Se usa generalmente para obtener propiedades en cosas. Por ejemplo, si tiene una lista de objetos Person, y que quería tener en sus nombres, que haría

var listOfNames = listOfPeople.Select(p => p.Name); 

Se puede pensar en este modo:

  • convierten la lista de las personas en una lista de cadenas, utilizando el siguiente método: (p => p.Name)

Para "seleccionar" (en el sentido de "filtrado" de la palabra) un subconjunto de una colección, debe usar Dónde .

Gracias Microsoft por la terrible denominación

+0

¿Nombres terribles? "Seleccionar" está seleccionando, "Dónde" está filtrando. Igual que SQL ... – TheSoftwareJedi

+0

Sí, igual que SQL, pero diferente de cualquier otro lenguaje de programación (ruby, lisp, python, etc.) que utilice el mapa para 'seleccionar' y seleccione 'dónde' –

+0

Thx para la información sobre el Seleccionar. –