Parent{ List<Child> Children {get;set;} }
Child { int Age {get;set;} }
我想按照 child 的最低年龄对 parent 进行排序,在平局的情况下继续到第二个或第三个 child 。
我最接近的是这个,它只由最小的 child 点菜:
parents.OrderBy(p => p.Children.Min(c => c.Age))
在平局的情况下,这不考虑第二(或第三等)最小的。
鉴于这 3 位 parent 和相应的 child 年龄,我希望他们按这个顺序出来。
- P1 1,2,7
- P2 1,3,6
- P3 1,4,5
最佳答案
因此,您在概念层面上尝试做的是比较两个序列。我们可以简单地编写一个能够比较任意两个序列的比较器,而不是尝试针对这个特定序列进行特殊处理。
它会遍历序列中的项目,比较相同位置的项目,然后如果找到不相等的一对,它就会知道结果。
public class SequenceComparer<TSource> : IComparer<IEnumerable<TSource>>
{
private IComparer<TSource> comparer;
public SequenceComparer(IComparer<TSource> comparer = null)
{
this.comparer = comparer ?? Comparer<TSource>.Default;
}
public int Compare(IEnumerable<TSource> x, IEnumerable<TSource> y)
{
return x.Zip(y, (a, b) => comparer.Compare(a, b))
.Where(n => n != 0)
.DefaultIfEmpty(x.Count().CompareTo(y.Count()))
.First();
}
}
现在我们可以在调用 OrderBy
时简单地使用这个比较器:
var query = parents.OrderBy(parent => parent.Children
.OrderBy(child => child.Age)
.Select(child => child.Age)
, new SequenceComparer<int>());
关于c# - 按 Linq 子集合中的最小值排序父集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552503/