2010-03-31 12 views
19

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

+0

@phsr ¿Importa? – baron

+0

Hay muchas preguntas sobre tareas en stackoverflow. Solo etiquetar apropiadamente. (En cualquier caso, no creo que este sea). – harpo

+4

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;) –

Respuesta

20

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.

+0

esto, por cierto, funcionará más rápido de lo que Tomas sugirió a continuación – vittore

+2

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). –

18

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.

Cuestiones relacionadas