LINQ排序属性列表中的自定义对象列表

时间:2013-10-02 09:03:29

标签: c# linq sorting

我有两个对象列表,每个对象都有属性Recommendations,它本身就是一个'Recommendation'对象列表。我想基于其中一个属性对推荐对象进行排序。我想出了这个:

TPSqlORs.Where(x => x.Recommendations != null)
    .ToList()
    .ForEach(y => y.Recommendations.OrderBy(z => z.PointNumber));
SbmReportsORs.Where(x => x.Recommendations != null)
    .ToList()
    .ForEach(y => y.Recommendations.OrderBy(z => z.PointNumber));

但它对原始列表没有任何改变,这使我怀疑ToList()只是制作副本而且排序发生在执行后丢失的副本上。我沿着这些线搜索,但显然虽然它确实复制了,但新列表包含对原始列表元素的引用,所以它肯定应该为两个列表排序吗?

4 个答案:

答案 0 :(得分:4)

OrderBy不会更改列表的顺序。如果您想要更改订单,请写下:

y.Recommendations = y.Recommendations.OrderBy(z => z.PointNumber).ToList()

了解OrderBy

答案 1 :(得分:2)

OrderBy永远不会更改原始列表的顺序。它与其他LINQ方法一起是纯函数。它们不会修改输入,只会创建新输出。

答案 2 :(得分:2)

由于Recommendations实际上是List<Recommendation>,您可以使用List.Sort()对其进行排序:

item.Recommendations.Sort((lhs, rhs) => lhs.PointNumber.CompareTo(rhs.PointNumber));

这假设item是包含您要排序的Recommendations的对象。

如果列表中的Recommendation元素可以为null,则可以这样处理:

item.Recommendations.Sort
(
    (lhs, rhs) =>
    (lhs == null || rhs == null)
    ? Comparer<object>.Default.Compare(lhs, rhs) 
    : lhs.PointNumber.CompareTo(rhs.PointNumber)
);

有关详细信息,请参阅List.Sort(Comparison<T> comparison)

请注意,List.Sort()不稳定排序,而Enumerable.OrderBy()是一种稳定排序,但这不太可能对您的情况产生影响。你需要意识到这种差异。

[编辑:我已将Jeppe Stig Nielsen的评论合并到下面;我要感谢他。]

答案 3 :(得分:0)

大多数LINQ表达式不对源进行更改,它们返回结果集合。