2010-03-31 24 views
19

Ben allStudents = Dictionary<ClassRoom, List<Student>>() Linq yılındaC# linq

nasıl erkek tüm öğrencilerin bir listesini alacağı bir nesne var? Tüm sınıflardan (student.Gender == "m")? Ian

+0

@phsr fark etmez mi? – baron

+0

Yığın akışında birçok ödev sorusu var. Sadece uygun şekilde etiketleyin. (Her halükârda bunun olduğunu sanmıyorum.) – harpo

+4

Bu nesneleri, evrensel olarak anlaşılacakları gibi kullandım. Gerçek iş nesneleri genel kullanıcılar tarafından bilinemezdi. Yıllar önce ev ödevi yapmak için toooo mezun oldum;) –

cevap

20

Buna hile SelectMany operasyon

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

olduğunu aşağıdakiler deneyin. List<Student> koleksiyonunu tek bir Student koleksiyonuna düzleştirme etkisine sahiptir. Ortaya çıkan liste, her bir listeyi arkaya dizilmiş olsaydınız aynıdır.

+0

Bu btw, Tomas'ın önerdiği – vittore

+2

'dan daha hızlı çalışacaktır Evet, C# derleyici sorgusu biraz daha karmaşık kodlara çevirir, fakat farkın o kadar olacağını düşünmüyorum Makul bir senaryoda madde. Daha okunaklı görünen bir çözüm seçmek daha önemlidir (ki bu kişisel bir fikirdir). –

18

Yuvalanmış from maddesini kullanabilirsiniz. İlk from, öğrencileri ile birlikte tüm sınıfları (sözlükten bir öğe) KeyValuePair<ClassRoom, List<Student>> olarak temsil eder. Sonra Value özelliğini kullanarak sınıftan tüm öğrencileri seçmek ve bunları filtreleyebilirsiniz:

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

kapağın altında, iç içe from fıkra SelectMany yöntem çağrısına çevrilmiştir.