2010-03-31 15 views
19

Ho un oggetto allStudents = Dictionary<ClassRoom, List<Student>>()C# LINQ nel dizionario <>

in LINQ come faccio a ottenere un elenco di tutti gli studenti che sono di sesso maschile? (student.Gender == "m") da tutte le classi?

Ian

+0

@phsr importa? – baron

+0

Ci sono un sacco di domande sui compiti su StackOverflow. Basta taggare in modo appropriato. (In ogni caso, non penso che questo sia.) – harpo

+4

Ho usato quegli oggetti così come sarebbero stati universalmente compresi. I veri oggetti di business non sarebbero noti agli utenti generali. Molti anni fa mi sono diplomato troppo); –

risposta

20

provare le seguenti

var maleStudents = allStudents 
    .SelectMany(x => x.Values) 
    .Where(x => x.Gender=="m"); 

Il trucco per questo è l'operazione SelectMany. Ha l'effetto di appiattire una raccolta di List<Student> in un'unica raccolta di Student. L'elenco risultante è lo stesso che se avessi allineato ogni lista in primo piano.

+0

, btw, funzionerà più velocemente di quanto suggerito da Tomas sotto – vittore

+2

Sì, il compilatore C# traduce la query in un codice leggermente più complicato, ma non credo che la differenza importa in ogni ragionevole scenario. È più importante scegliere la soluzione che sembra più leggibile (che è un'opinione personale). –

18

È possibile utilizzare la clausola nidificata from. Il primo from seleziona tutte le classi insieme ai loro studenti (una voce dal dizionario), che è rappresentata come KeyValuePair<ClassRoom, List<Student>>. Quindi è possibile selezionare tutti gli studenti dalla classe utilizzando la proprietà Value e filtrarli:

var q = from cls in allStudents 
     from s in cls.Value 
     where s.Gender == "M" select s; 

Sotto il coperchio, la clausola di from nidificato è tradotto alla chiamata SelectMany metodo.

Problemi correlati