1

我有两个对象列表,每个对象都有属性 Recommendations,它本身就是一个“推荐”对象列表。我想根据其属性之一对推荐对象进行排序。我想出了这个:

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

4 回答 4

4

OrderBy没有改变列表的顺序。如果你想改变顺序,你应该写:

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

阅读OrderBy

于 2013-10-02T09:04:56.010 回答
2

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

于 2013-10-02T09:07:29.700 回答
2

由于Recommendations实际上是 a List<Recommendation>,因此您可以使用以下命令对其进行就地排序List.Sort()

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

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

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

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 评论中合并了代码;我感谢他。]

于 2013-10-02T09:17:11.087 回答
0

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

于 2013-10-02T09:08:17.260 回答