【问题标题】:Does a List<T> guarantee that items will be returned in the order they were added?List<T> 是否保证项目将按照添加的顺序返回?
【发布时间】:2010-10-01 23:12:18
【问题描述】:

List&lt;T&gt; 是否始终保证项目将按照枚举时添加的顺序返回?

更新:谢谢大家的回答,让我放心。我用 .NET Reflector 快速浏览了 List&lt;T&gt; 类(可能一开始就应该这样做),实际上底层存储是 T (T[]) 的数组。

【问题讨论】:

  • 虽然我们现在已经通过实验和逆向工程确定,当前形式的 List 确实保留了顺序,但如果微软将其正式发布并提供此保证,那就太好了在文档中。读这篇文章的人有一些影响力吗?
  • @I.J.Kennedy effin A!这适用于更多的 MS 文档。 +1 给你。 (如果可以的话,+100)。有成千上万甚至数百万的 MS 开发人员花费时间进行逆向工程、测试等,这一切都是因为缺少来自 MS 的几句话。他们难道没有意识到这一点吗?岁月流逝,一切都没有改变。

标签: .net list collections


【解决方案1】:

是的。但这不是规范的一部分。

参考:List Class

【讨论】:

  • 在那种情况下,取决于这个特定的实现细节将是一个错误,不是吗?
  • 我找不到这方面的参考资料,你能引用一个吗?
【解决方案2】:

是的,List&lt;T&gt; 保证插入顺序和检索顺序,这在 MSDN 上有记录(下面的重点是我的)。

插入

List&lt;T&gt;.Add Method

将对象添加到List&lt;T&gt;的末尾

项目参数为:

要添加到 List&lt;T&gt; 末尾的对象

List&lt;T&gt;.AddRange Method

将指定集合的​​元素添加到List&lt;T&gt;的末尾

采集参数为:

其元素应添加到List&lt;T&gt;的末尾的集合。

检索

List&lt;T&gt;.Enumerator Structure

最初,枚举器位于集合中的第一个元素之前。在此位置,Current 未定义。因此,在读取Current 的值之前,您必须调用MoveNext 将枚举器推进到集合的第一个元素

Current 在调用MoveNext 之前返回相同的对象。 MoveNextCurrent 设置为下一个元素

【讨论】:

  • Alex,我想你可能已经得出了一个没有根据的结论。 “集合中的第一个元素”不一定与“添加到集合中的第一个元素”相同。 “最后一个元素”也是如此。该文档没有说明检索顺序与插入顺序有关。
  • 只是想知道,does AddRange() 保留传递给它的元素的顺序,还是可以随意乱用将它们添加到内部数组的顺序? (显然它们都将在当前列表的末尾)
  • 亚历克斯是正确的。 Microsoft 的 Add 方法专门指列表的顺序(在本例中为 end)。与插入方法(“指定索引”)一样。
  • 一旦你注意到 Lists 有数组索引器和 Insert() 方法(它需要一个索引),很明显它们必须是有序的。这两个功能都要求是这种情况。这些方法与类的最终用户形成契约,除非您稍后移动它们,否则这些值将在指定的位置可用。
  • 文档好像更新了?现在添加到 AddRange 描述中:l docs.microsoft.com/en-us/dotnet/api/… > 集合中元素的顺序保存在 List 中。
【解决方案3】:

列表是基于索引的,新项目将始终添加到列表的末尾。您可以在某个索引处插入项目,以便下一个项目移动一个位置。

所以是的,您可以这样安全地使用它...

List(T) 类是泛型的 等价于 ArrayList 类。它 实现 IList(T) 泛型 使用大小为的数组的接口 根据需要动态增加。

这个集合中的元素可以是 使用整数索引访问。 此集合中的索引是 从零开始。

不保证 List(T) 是 排序。您必须对 List(T) 进行排序 在执行操作之前(例如 BinarySearch) 需要 List(T) 进行排序。

一个 List(T) 可以支持多个阅读器 同时,只要 集合未修改。 通过集合枚举是 本质上不是线程安全的 程序。在极少数情况下 枚举与一个或多个竞争 写访问,唯一的方法来确保 线程安全就是锁定 在整个收集 枚举。允许集合 被多个线程访问 阅读和写作,你必须 实现您自己的同步。

您可以在MSDN 上阅读更多相关信息。

【讨论】:

  • List 的文档似乎没有说明检索顺序与插入顺序相同。目前,它的行为确实如此,但没有记录这样做。
  • 这确实是正确的,意识到这一点总是好的,当它绝对关键时,不要指望它!
  • @Cheeso 它确实保证了检索的顺序。我添加了一个包含此详细信息的答案。
  • 嗨。你知道行为是否与内联初始化相同?
【解决方案4】:

是的,据此MSDN Forum thread

【讨论】:

  • 这是一个仅链接的答案...您能否请包含该链接的上下文?
猜你喜欢
  • 2016-01-06
  • 2010-11-05
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-01-19
  • 1970-01-01
相关资源
最近更新 更多