2011-06-28 34 views
0

私はObservableCollection<Student>を入れ子にしました。そこから、LINQまたはLambdaを使ってId値に基づいて特定の生徒を得る方法はありますか?複雑なネストされた観測可能なコレクションのLINQ

public class Student 
    { 

     public Student() 
     { 

     } 

     public string Name; 
     public int ID; 
     public ObservableCollection<Student> StudLists; 
    } 

各生徒オブジェクトには生徒コレクションがあり、任意の数の入れ子になったレベルのようになることができます。どうやってLINQをやることができますか?私は試しました

var studs = StudCollections.Where(c => c.StudLists.Any(m => m.ID == 122)); 

これは正確な学生アイテムを与えていませんか?何か案が ?

答えて

1

あなたはStudCollectionsのすべての子孫を検索したい意味なら、あなたはそうのような拡張メソッドを書くことができます:

static public class LinqExtensions 
{ 
    static public IEnumerable<T> Descendants<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> DescendBy) 
    { 
    foreach (T value in source) 
    { 
     yield return value; 

     foreach (T child in DescendBy(value).Descendants<T>(DescendBy)) 
     { 
      yield return child; 
     } 
    } 
    } 
} 

などのようにそれを使用する:あなたは1をしたい場合

var students = StudCollections.Descendants(s => s.StudLists).Where(s => s.ID == 122); 

一致するIDを持つ学生:

var student = StudCollections.Descendants(s => s.StudLists).FirstOrDefault(s => s.ID == 122); 

if (student != null) 
{ 
    // access student info here 
} 
+0

私はそれに勝つだけでなく、より良い答えがあります。私はこれが好き。さらにOPの最後の文章では、彼が本当に望んでいるのは、「ファースト」または「シングル」(またはOrDefaultの変形) – Davy8

+0

はい、ありがとうございます、回答が – devdigital

+0

に更新されました。 – coldwind

関連する問題