Tengo un objeto allStudents = Dictionary<ClassRoom, List<Student>>()
C# linq en el diccionario <>
en LINQ ¿cómo puedo obtener una lista de todos los estudiantes que son hombres? (student.Gender == "m") de todas las clases?
Ian
Tengo un objeto allStudents = Dictionary<ClassRoom, List<Student>>()
C# linq en el diccionario <>
en LINQ ¿cómo puedo obtener una lista de todos los estudiantes que son hombres? (student.Gender == "m") de todas las clases?
Ian
intente lo siguiente
var maleStudents = allStudents
.SelectMany(x => x.Values)
.Where(x => x.Gender=="m");
El truco para esto es la operación SelectMany
. Tiene el efecto de aplanar una colección de List<Student>
en una sola colección de Student
. La lista resultante es la misma que si alinearas cada lista de adelante hacia atrás.
esto, por cierto, funcionará más rápido de lo que Tomas sugirió a continuación – vittore
Sí, el compilador C# traduce la consulta a un código un poco más complicado, pero no creo que la diferencia importa en cualquier escenario razonable. Es más importante elegir la solución que parece más legible (que es una opinión personal). –
Puede usar la cláusula from
anidada. El primer from
selecciona todas las clases junto con sus alumnos (un elemento del diccionario), que se representa como KeyValuePair<ClassRoom, List<Student>>
. A continuación, puede seleccionar todos los estudiantes de la clase mediante la propiedad Value
y filtrarlos:
var q = from cls in allStudents
from s in cls.Value
where s.Gender == "M" select s;
Bajo la cubierta, la cláusula anidada from
se traduce a la llamada SelectMany
método.
@phsr ¿Importa? – baron
Hay muchas preguntas sobre tareas en stackoverflow. Solo etiquetar apropiadamente. (En cualquier caso, no creo que este sea). – harpo
Usé esos objetos como se entenderían universalmente. Los objetos comerciales reales no serían conocidos por los usuarios generales. Me gradué demasiado hace muchos años para tener tarea más;) –