如何查找嵌套在多级集合中的对象
本文关键字:集合 多级 对象 嵌套 何查找 查找 | 更新日期: 2023-09-27 18:24:41
假设我有一个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
}
示例ViewModel:
class FamilyViewModel
{
public List<Family> Families {get;set;}
public bool ChildHasFamily(Child child)
{
// Determine if child is in any family or not
}
}
现在我还不太清楚。我认为你的Child
应该有Family
属性,这样做会更容易。如果我理解正确,您的视图模型有一个族列表,该列表又包含子族列表。当你收到孩子的名单时,你想知道它是否在你的家庭中:
class FamilyViewModel
{
public List<Family> Families {get;set;}
public void ChildHasFamily(Child child)
{
var hasFamily = Families.SelectMany(f => f.Children)
.Contains(child);
}
}
请注意,这将进行对象引用比较。如果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
谓词。
您可以使用以下使用延迟执行的递归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;
}
}
}
}