Если класс Child
определил операцию равенства путем реализации IEquatable<Child>
, вы можете легко сделать это, используя лямбду, метод LINQ Enumerable.Where
и метод List.Contains
:
var parents = new List<Parent> { ... }; // fully populated list of parents
var child = null; // the child you are looking for goes here
var filtered = parents.Where(p => p.Children.Contains(child));
Теперь вы можете перебирать filtered
и выполнять свою бизнес-логику.
Если класс Child
не имеет явно определенной операции равенства (что означает, что он будет использовать правила равенства ссылок вместо проверки идентичных ChildName
), то вам нужно будет включить «что проходит для равных» зайди в лямбду сам:
var filtered = parents.Where(p => p.Children.Any(c => c.ChildName == "child1"));
Примечание: Конечно, есть много других способов сделать вышеупомянутое, включая, возможно, более легкий для чтения
parents.Where(p => p.Children.Count(c => c.ChildName == "child1") > 0);
Однако это не так эффективно, как в версии Any
, даже если она даст те же результаты.
В обоих случаях лямбды очень «читают как» то, что они должны делать:
- Я хочу, чтобы те родители, у которых в коллекции «Дети» есть этот элемент *
- Я хочу, чтобы те родители, у которых хотя бы один из детей имел
ChildName == "child1"