2013-07-23 84 views
0

可以說我有一個List<Family>,每個家庭都有一個List<Child>如何查找嵌套在多級集合中的對象

當我在代碼中遇到Child對象時,如何確定孩子是否屬於任何家庭的一部分?

僞代碼:

If Child not in any family 
    // Do something with child 

更新:

實施例模型:

class Family 
{ 
    public List<Child> Children {get;set;} 
    // Properties 
} 

class Child 
{ 
    // Properties 
} 

實施例視圖模型:

class FamilyViewModel 
{ 
    public List<Family> Families {get;set;} 

    public bool ChildHasFamily(Child child) 
    { 
    // Determine if child is in any family or not 
    } 
} 
+0

你的課程是什麼樣的? –

+0

在OP –

+0

中添加信息爲什麼'ChildHasFamily'「返回」_void_而不是'bool'? –

回答

2

現在,這是不是所有的清潔給我。我認爲你的Child應該有Family屬性使事情變得更容易。如果我理解正確,你的視圖模型有一個家庭列表,而這個列表又包含一個孩子列表。當您收到孩子的名單,你想知道這是否是在你的家庭之一:

class FamilyViewModel 
{ 
    public List<Family> Families {get;set;} 

    public void ChildHasFamily(Child child) 
    { 
     var hasFamily = Families.SelectMany(f => f.Children) 
           .Contains(child); 
    } 
} 

注意,這會做一個對象引用的比較。如果孩子執行IEquatable<Child>,它會開箱即用。如果沒有,則可以使用:

class FamilyViewModel 
{ 
    public List<Family> Families {get;set;} 

    public void ChildHasFamily(Child child) 
    { 
     var hasFamily = Families.SelectMany(f => f.Children) 
           .Any(c => c.Name == child.Name); 
    } 
} 

替換Where謂詞以進行身份​​比較。

+0

發現你的解決方案是最乾淨和最接近我所尋找的。謝謝! –

0

您可以使用以下遞歸Traverse方法,該方法使用延遲執行。

然後,它很容易爲:

IEnumerable<Family> familiesOfChild = families.Traverse(f => f.Children) 
    .Where(c => c.Equals(yourChild)); 
if(!familiesOfChild.Any()) 
{ 
    // oh, what a poor child 
} 

這裏是擴展方法:

public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse) 
{ 
    foreach (T item in source) 
    { 
     yield return item; 

     IEnumerable<T> seqRecurse = fnRecurse(item); 
     if (seqRecurse != null) 
     { 
      foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse)) 
      { 
       yield return itemRecurse; 
      } 
     } 
    } 
} 
相關問題