我有两个对象列表,每个对象都有属性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()
只是制作副本而且排序发生在执行后丢失的副本上。我沿着这些线搜索,但显然虽然它确实复制了,但新列表包含对原始列表元素的引用,所以它肯定应该为两个列表排序吗?
答案 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表达式不对源进行更改,它们返回结果集合。