list1
和 list2
中的项目顺序是否可以不同
list2 = list1.ToList()
并且都是 List
?
最佳答案
如果list1
顺序一致,则 list2
将以相同的顺序。
有可能 list1
是某种类型,它本身并不 promise 每次枚举时都具有相同的顺序,在这种情况下,两者当然可能不同,但它是 list1
的枚举逻辑。对此负责,而不是ToList()
. (list1
的名称表明它本身就是一个列表,在这种情况下顺序肯定是相同的)。
这里的一个答案已经包含了 ToList()
的实现之一的来源。 .它不是 ToList()
的唯一版本存在,并且 corefx 比 netfx 针对更多情况进行了优化,但所有版本生成列表的顺序仍然与它们源在枚举时交付它们的顺序相同。
另一个答案说文档中不能保证这一点,只能通过 List<T>
的重载描述来保证采用枚举的构造函数(顺便说一下,这不是所有情况下 ToList()
的所有实现使用的唯一构造函数)。
但是,更改为 ToList()
不 promise 维持秩序的将不被接受。
考虑 someSource.OrderBy(x => x.ID).ToList()
的情况.在这种情况下(顺便说一句,这是在 corefx 中优化的情况)如果 ToList()
可以更改顺序它显然会删除 OrderBy()
的点.
好吧,如果有人改变了又怎样ToList()
以一种不 promise 维持秩序但对待OrderBy()
的方式作为特例? (毕竟,出于性能原因,在一个版本中它已经是一个特例)。好吧,那仍然会中断说 someSource.OrderBy(x => x.ID).Where(x => !x.Deleted).ToList()
.总之,如果我们有一个 ToList()
的版本不维持秩序我们将能够提出某种 linq 查询,其中给定的订单由查询的另一部分 promise ,这样一个 ToList()
的实现。违反了整个查询的 promise 。
因此,除非使用特殊外壳,否则明确不 promise 维持秩序的来源( ParallelEnumerable
不会,除非您使用 AsOrdered()
,因为除非确实有必要,否则不维持秩序有很多优点涉及到并行处理)我们无法更改 ToList()
在不违反 linq 查询作为一个整体的 promise 的情况下,它无法维持秩序。
因此,虽然 ToList()
的文档中没有提到保证, 但保证不会在以后的版本中更改。
关于c# - ToList() 可以更改列表中项目的顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205469/