2011-06-28 61 views
0

我有一個嵌套的ObservableCollection<Student>,從中我可以如何使用LINQ或Lambda獲取基於Id值的特定學生?這裏是我的學生類:關於複雜嵌套可觀察集合的LINQ

public class Student 
    { 

     public Student() 
     { 

     } 

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

所以每個學生對象都可以有一次學生集合,它可以去像任何數量的嵌套級別。我們如何做到這一點LINQ或使用Lambda?我曾嘗試過

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; 
     } 
    } 
    } 
} 

,並使用它,像這樣:如果你想要一個

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的最後一句話,我認爲他真正想要的是'First'或'Single'(或「OrDefault」變體) – Davy8

+0

是的,謝謝,答案已更新 – devdigital

+0

當我們遍歷結果時,拋出錯誤。 – coldwind