2010-03-31 33 views
19

Tôi có một đối tượng allStudents = Dictionary<ClassRoom, List<Student>>()C# linq trong Từ điển <>

Trong Linq làm cách nào để có danh sách tất cả học sinh nam? (student.Gender == "m") từ tất cả các Lớp học?

Ian

+0

@phsr có vấn đề gì không? – baron

+0

Có rất nhiều câu hỏi về bài tập về nhà trên stackoverflow. Chỉ cần gắn thẻ một cách thích hợp. (Trong mọi trường hợp, tôi không nghĩ rằng điều này là.) – harpo

+4

Tôi đã sử dụng các đối tượng đó vì chúng sẽ được hiểu rộng rãi. Các đối tượng kinh doanh thực sự sẽ không được biết đến với người dùng chung. Tôi tốt nghiệp toooo nhiều năm trước để có bài tập về nhà nữa;) –

Trả lời

20

hãy thử như sau

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

Bí quyết vấn đề này là các hoạt động SelectMany. Nó có tác dụng làm phẳng một bộ sưu tập của List<Student> thành một bộ sưu tập duy nhất của Student. Danh sách kết quả giống như nếu bạn xếp hàng từng mặt trước của danh sách quay lại.

+0

btw này, sẽ hoạt động nhanh hơn những gì Tomas đề xuất bên dưới – vittore

+2

Có, trình biên dịch C# dịch truy vấn thành mã phức tạp hơn một chút, nhưng tôi không nghĩ rằng sự khác biệt sẽ trong bất kỳ kịch bản hợp lý nào. Điều quan trọng hơn là chọn giải pháp trông dễ đọc hơn (đó là ý kiến ​​cá nhân). –

18

Bạn có thể sử dụng mệnh đề lồng nhau from. Đầu tiên from chọn tất cả các lớp cùng với sinh viên của họ (một mục từ điển), được thể hiện dưới dạng KeyValuePair<ClassRoom, List<Student>>. Sau đó, bạn có thể chọn tất cả học sinh từ lớp bằng cách sử dụng Value tài sản và lọc chúng:

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

Dưới nắp, mệnh đề lồng nhau from được phiên dịch sang các cuộc gọi SelectMany phương pháp.

Các vấn đề liên quan