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
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
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.
, btw, funzionerà più velocemente di quanto suggerito da Tomas sotto – vittore
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). –
È 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.
@phsr importa? – baron
Ci sono un sacco di domande sui compiti su StackOverflow. Basta taggare in modo appropriato. (In ogni caso, non penso che questo sia.) – harpo
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); –