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

2024-04-17

Parent{ List<Child> Children {get;set;} }
Child { int Age {get;set;} }

我想按照孩子年龄最小的顺序对父母进行排序,如果平局,则按第二个或第三个孩子的顺序排列。

我最接近的是这个,它只由最小的孩子点餐:

parents.OrderBy(p => p.Children.Min(c => c.Age))

在平局的情况下,这不考虑第二(或第三等)最年轻的人。

鉴于这三位父母都有相应的孩子年龄,我希望他们按这个顺序出来。

  • 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>());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐