2010-03-31 2 views
19

나는 allStudents = Dictionary<ClassRoom, List<Student>>() Linq에에서C#을 LINQ는

이 어떻게 남성의 모든 학생들의 목록을 얻을 것 객체가? (student.Gender == "m") 모든 교실에서? 이안

+0

@phsr이 중요합니까? – baron

+0

많은 stackoverflow에 대한 숙제 질문이 있습니다. 태그를 올바르게 지정하십시오. (어쨌든, 나는 이것이 하나라고 생각하지 않는다.) – harpo

+4

나는 보편적으로 이해할 수있는 것처럼 그 객체들을 사용했다. 실제 비즈니스 객체는 일반 사용자에게 알려지지 않습니다. 나는 수년 전에 숙제를하기 위해 몇 년 전에 졸업했다;) –

답변

20

는이에 대한 트릭은 SelectMany 작동

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

입니다 다음보십시오. List<Student> 컬렉션을 Student의 단일 컬렉션으로 병합하는 효과가 있습니다. 결과 목록은 앞뒤로 각 목록을 정렬 한 것과 같습니다.

+0

이 btw는 Tomas가 아래에 제안한 것보다 더 빨리 작동 할 것이다 – vittore

+2

예, C# 컴파일러는 쿼리를 약간 더 복잡한 코드로 변환하지만 차이는 없을 것이라고 생각합니다. 어떤 합리적인 시나리오에서도 중요합니다. 가독성이 높아 보이는 솔루션을 선택하는 것이 더 중요합니다 (개인적인 의견 임). –

18

중첩 된 from 절을 사용할 수 있습니다. 첫 번째 from은 학생과 함께 모든 수업을 선택합니다 (사전의 항목).이 학생은 KeyValuePair<ClassRoom, List<Student>>으로 표시됩니다. 그런 다음 Value 속성을 사용하여 클래스의 모든 학생을 선택하고 필터링 할 수

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

을 커버에서 중첩 된 from 절은 SelectMany 메서드 호출로 변환됩니다.