c# - 按 Linq 子集合中的最小值排序父集合

标签 c# linq

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/

相关文章:

c# - 应用程序如何正确崩溃?

c# - LINQ Select Distinct 忽略 XML 字段

c# - Windows 服务中 COM 对象的事件处理

c# - 如何通过 C# 中的子类继承接口(interface)方法

c# - 使用 LINQ 将 List<U> 转换为 List<T>

C# 限制列表框项目

c# - Linq to SQL、InsertOnSubmit 与 InsertAllOnSubmit 性能对比?

c# - LINQ 匹配另一个列表中的子字符串

c# - 如何设计一个接收多条消息启动的NServiceBus Saga

c# - 如何在 C#/Win32 中将文本发送到记事本?