【问题标题】:Is the order of a list or array always the same?列表或数组的顺序是否始终相同?
【发布时间】:2020-01-26 14:17:26
【问题描述】:

考虑 int 的简单列表:

var ints = new List<int>
{
    1, 2, 3
};

如果我循环通过它,它是否总是以相同的顺序(1、2、3)排序? 即使我将它作为参数传递给函数,或者如果我将它作为一个列表传递给一个线程来处理?

数组有什么不同吗? IEnumerable 呢?

如果我例如:

ints.RemoveAt(1);
ints.Add(4);

会一直是1,3,4吗?

如果我编辑了一个元素呢?这些只是整数,但如果它们是复杂的对象,例如人,我抓住了人Bob(可以在任何索引处)并添加了他的整个传记。

会改变列表的顺序吗?

我可以使用OrderBy,但我只是想知道列表的顺序是否相同。

【问题讨论】:

  • 是的。任何对象在 c# 中都是一样的,除非值改变。
  • 您在使用 msdn 时是否阅读过remarks?对于Add 方法,它甚至是第一句话。
  • 您查看文档了吗?数组保证顺序,因为它们数组——一个连续的内存块。列表也保证了这一点,并且在内部它们使用数组。另一方面,IEnumerable 只是 every 容器之上的一个接口。它返回项目的顺序取决于该容器
  • 当您Add 列表中的某些内容时,它会添加到指定索引处。 (最后一个 + 1)。
  • 为什么要问这个问题?背后有什么不同的问题吗?某些操作可能会返回意外结果?

标签: c# list integer


【解决方案1】:

列表基本上只是一个具有更多功能的高级数组。

这意味着如果您将某些内容添加到列表中,它将保留在同一个位置

但是,如果您删除列表中间的某些内容,它会将索引向下移动。

这意味着如果你有这个列表

List<int> numbers = new List<int>() {0, 1, 2, 3, 4};

并删除索引 1 上的项目,您将得到此列表

{0, 2, 3, 4};

这意味着索引 2 上的数字现在在索引 1 上。

仅当您更改列表本身时,列表的顺序才会改变 (删除和项目,添加项目,或手动更改列表的顺序(例如 orderBy)

如果您更改列表中的对象,它不会改变。

IEnumerable 可以不同,因为它只是一个接口,它指定了一些必须实现的方法,例如 GetEnumerator 方法。所以这意味着它取决于 IEnumerable 的实现

(有关此问题的更多信息“Can anyone explain IEnumerable and IEnumerator to me?

希望对你有帮助

【讨论】:

    【解决方案2】:

    在 .Net 框架中,列表和数组是基于索引的集合。
    这意味着可以使用集合中的索引访问集合中的元素 - 所以是的 - 它们都必须在内部保留相同的元素顺序。

    这是因为List&lt;T&gt;T[] 都实现了IList&lt;T&gt; 接口,该接口被定义为可以通过索引单独访问的对象集合。

    IEnumerable 没有真正排序,它所做的只是公开一个名为 GetEnumerator() 的方法 - 而它返回的 IEnumerator 确实提供了一个 Current 属性和一个暗示顺序的 MoveNext() 方法 - 那是并非如此。

    事实上,感谢yield return,即使没有集合,您也可以创建IEnumearble - 例如:

    Random rnd = new Random();
    IEnumerable<int> someMethod()
    {
         for(var i=0;i<10;i++)
             yield return rnd.Next(1, 10);
    }
    

    IList&lt;T&gt; 实现了IEnumerable&lt;T&gt; 接口,但反之则不然。

    所以,回答你的问题:

    如果我循环遍历它,它是否总是以相同的顺序(1、2、3)排序?即使我将它作为参数传递给函数?即使我将它作为要处理的线程列表传递?

    是的。

    数组有什么不同吗?

    在这方面不是。

    IEnumerable 呢?

    它们可能不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多