LINQ – 集合内的filter集合
假设我有以下课程:
class Parent { bool Gender { get; set; } List Children { get; set; } } class Child { bool Gender { get; set; } List GrandChildren { get; set; } } class GrandChild { bool Gender { get; set; } }
使用linq,任何人都可以通过返回List
来帮助我过滤Parent对象,其中每个Child具有Gender == false
并且每个Child的GrandChild具有Gender == false
?
我已经设法返回List
但我确实需要维护层次结构。
你的问题有点模糊。 这是一个重建儿童和孙子名单的解决方案,我不确定我是否需要这个孩子.GrandChildren.All(gc =>!gc.Gender)所以为了清楚起见我把它留了下来:
parents.Select(parent => new Parent { Gender = parent.Gender, Children = parent.Children.Where(child => !child.Gender).Select(child => new Child { Gender = false, GrandChildren = child.GrandChildren.Where(gc => !gc.Gender).ToList() } ).ToList() })
您正在寻找
.Where(p => p.Children.All(c => !c.Gender && c.GrandChildren.All(g => !g.Gender))
- 帮我过滤一个Parent对象
- 通过返回
List
- 每个孩子的性别==假
- 每个孩子的GrandChild都有性别==假?
字面翻译:
List results = ( from c in theParent.Children where !c.Gender where c.GrandChildren.Any(gc => !gc.Gender) select c ).ToList()
根据您的意见,您真正想要的是:
List result = ( from p in Parents where !p.Gender select new Parent() { Gender = p.Gender, Children = ( from c in p.Children where !c.Gender select new Child() { Gender = c.Gender, GrandChildren = ( from gc in c.GrandChildren where !gc.Gender select new GrandChild() { Gender = gc.Gender } ).ToList() } ).ToList() }).ToList();
var filteredParents = from p in parents where p.Children.All(child => !child.Gender && child.GrandChildren.All(grandChild => !grandChild.Gender)) select p;
在此处使用All
方法可确保作为参数传递给该方法的谓词对于给定序列中的所有元素都是true。
给出具有All
子项的每个父项的代码检查( Gender = false
并且还具有All
子项Gender = false
)。