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(使用前将#替换为@)