LINQ - a collection of filters within a collection

Let's say I have the following classes:

class Parent { bool Gender { get; set; } List<Child> Children { get; set; } } class Child { bool Gender { get; set; } List<Child> GrandChildren { get; set; } } class GrandChild { bool Gender { get; set; } } 

Using linq, can someone help me filter the parent object by returning a List<Child> where every Child has Gender == false and every Child GrandChild has Gender == false ?

I managed to return a List<GrandChild> , but I really need hierarchy support.

+4
source share
4 answers

Your question is a bit vague. Here's a solution that rebuilds the lists of children and grandchildren, I was not sure if I needed a child. GrandChildren.All (gc =>! Gc.Gender), so I left it for clarity:

 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() }) 
+6
source

You are looking for

 .Where(p => p.Children.All(c => !c.Gender && c.GrandChildren.All(g => !g.Gender)) 
+9
source
  • Help me filter the parent
  • returning a List<Child>
  • where each child has gender == false
  • and each grandchild child has a value of Gender == false?

Translated literally:

 List<Child> results = ( from c in theParent.Children where !c.Gender where c.GrandChildren.Any(gc => !gc.Gender) select c ).ToList() 

Based on your comments, what you really want:

 List<Parent> 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(); 
+2
source
 var filteredParents = from p in parents where p.Children.All(child => !child.Gender && child.GrandChildren.All(grandChild => !grandChild.Gender)) select p; 

Using the All method here ensures that the predicate passed as an argument to this method is valid for all elements in a given sequence.

This code checks for each parent who has All children with ( Gender = false , and also having All grand children Gender = false ).

+1
source

Source: https://habr.com/ru/post/1333484/


All Articles