Linq / lambda domanda su .Select (newby learning 3.0)
Domanda
Sto giocando con le nuove cose di C # 3.0 e ho questo codice (principalmente preso da MSDN ) ma posso solo ottenere vero, falso, vero ... e non il valore reale:
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);
}
Come posso sistemarlo per mostrare l'elenco di numeri interi?
Soluzione
Modifica " Seleziona " a un " Where "
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);
}
Il " Seleziona " Il metodo sta creando un nuovo elenco del risultato lambda per ciascun elemento (vero / falso). Il " Dove " il metodo sta filtrando in base al lambda.
In C #, puoi anche usare questa sintassi, che potresti trovare più chiara:
var oddNumbers = from n in numbers
where n % 2 == 1
select n;
che il compilatore traduce in:
var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
Altri suggerimenti
numbers.Select(n => n % 2 == 1);
Cambia questo in
numbers.Where(n => n % 2 == 1);
Ciò che seleziona è " converti " una cosa all'altra. Quindi, in questo caso, è " Conversione " n a " n% 2 == 1 " (che è un booleano) - quindi ottieni tutto il vero e il falso.
Di solito è usato per ottenere proprietà sulle cose. Ad esempio, se avessi un elenco di oggetti Person
e desideri ottenere i loro nomi, lo faresti
var listOfNames = listOfPeople.Select( p => p.Name );
Puoi pensarlo così:
- Converti l'elenco di persone in un elenco di stringhe, utilizzando il seguente metodo: (p = > p.Name)
Per " selezionare " (nel senso del "filtraggio" della parola) un sottoinsieme di una raccolta, devi usare Where.
Grazie a Microsoft per la terribile denominazione