bar.Foos.Where(x => x.Definition.Parent == null)
.Select(x => Tuple.Create(x,
bar.Foos.Where(c => c.Definition
.Parent == x.Definition
)));
Это вернет IEnumerable<Tuple<Foo, IEnumerable<Foo>>>
, где Item2
из Tuple
содержит дочерние элементы для родителя в Item1
.Для вашего примера это возвращает два кортежа:
Item1 = simpleDefinition
и Item2
, содержащий пустой перечисляемый Item1 = parentDefinition
и Item2
, содержащий перечисляемый, содержащий childDefinition
Возможно, есть более элегантный или более быстрый способ, но я не мог придумать его ...
Ну, я немного противоречу своему собственному комментарию с этим, но это возможно с GroupBy
- по крайней мере, почти:
bar.Foos.Where(x => x.Definition.Parent == null)
.GroupBy(x => x,
x => bar.Foos.Where(c => c.Definition.Parent == x.Definition));
Это вернет IEnumerable<IGrouping<Foo, IEnumerable<Foo>>>
.
Обновление:
Я хотел бы знать, если решениеВы хотели, возможно, вообще.
Да, это:
bar.Foos.Where(x => x.Definition.Parent != null)
.GroupBy(x => bar.Foos.Where(y => y.Definition == x.Definition.Parent)
.Single(),
x => x)
.Union(bar.Foos.Where(x => x.Definition.Parent == null &&
!bar.Foos.Any(c => c.Definition.Parent ==
x.Definition))
.GroupBy(x => x, x => (Foo)null));
Но я действительно не хочу знать большой O этого, и это действительно не должноиспользоваться; -)