2013-07-23 115 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; 
      } 
     } 
    } 
} 
相关问题