按Linq中子集合中的最小值对父集合进行排序

Dan*_*Dan 7 c# linq

Parent{ List<Child> Children {get;set;} }
Child { int Age {get;set;} }
Run Code Online (Sandbox Code Playgroud)

我想在孩子最低年龄的时候订购父母,在领带的情况下,请向第二或第三个孩子办理.

我最接近的是这个,只有最小的孩子订购:

parents.OrderBy(p => p.Children.Min(c => c.Age))
Run Code Online (Sandbox Code Playgroud)

在平局的情况下,这并不占第二(或第三等)最年轻.

鉴于这3个父母有相应的孩子年龄,我希望他们按此顺序出来.

  • P1 1,2,7
  • P2 1,3,6
  • P3 1,4,5

Ser*_*rvy 3

因此,您要做的就是在概念层面上比较两个序列。我们可以简单地编写一个能够比较任何两个序列的比较器,而不是尝试对这个特定序列进行特殊处理。

它将遍历序列中的项目,比较相同位置的项目,然后如果发现一对不相等,它就会知道结果。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以在调用时简单地使用这个比较器OrderBy

var query = parents.OrderBy(parent => parent.Children
    .OrderBy(child => child.Age)
    .Select(child => child.Age)
    , new SequenceComparer<int>());
Run Code Online (Sandbox Code Playgroud)