c# - ToList() 可以更改列表中项目的顺序吗?

标签 c# list

list1list2 中的项目顺序是否可以不同
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/

相关文章:

c# - 通过 WebService 发送电子邮件

c# - 如何编写正确的语法以从 C# 代码重命名 SQL Server 数据库表?

list - 如何使用第二个列表中的列表值外键 id 从列表中检索 Flutter Dart 列表值

python - 类中的列表未转储到文件

python - 列表理解,但在根据条件选择迭代的列表上

python - 我可以在 map() 函数中使用 range() 吗?

java - 从字符串集列表到普通列表

c# - 属性只能由序列化程序设置

c# - 如何检测任何特定驱动器是否为硬盘驱动器?

c# - 从接口(interface)派生的通用对象的 XML 序列化列表,,,