繁体   English   中英

每个循环的C#以什么顺序迭代List <T>?

[英]In what order does a C# for each loop iterate over a List<T>?

我想知道C#中的foreach循环通过System.Collections.Generic.List<T>对象循环的顺序。

我发现关于同一主题的另一个问题 ,但我觉得它不能满足我的问题。

有人说未定义任何订单。 但正如其他人所说,它遍历数组的顺序是固定的(从0到长度-1)。 8.8.4 foreach声明

还有人说,对于任何带有订单的标准类(例如List<T> )也是如此。 我找不到任何文件来支持这一点。 所以我知道它现在可能会起作用,但也许在下一个.NET版本中它会有所不同(即使它可能不太可能)。

我也没有运气看过List(t).Enumerator文档。

另一个相关问题表明,对于Java,它在文档中特别提到:

List.iterator()以适当的顺序返回此列表中元素的迭代器。“

我在C#文档中寻找类似的东西。

提前致谢。

编辑:感谢所有人的所有答案(令人惊讶的是我收到了如此多的回复)。 我从所有答案中理解的是, List<T>总是按其索引的顺序迭代。 但我仍然希望看到明确的文档和平,这与ListJava文档类似。

基本上由IEnumerator实现 - 但对于List<T> ,它将始终按列表的自然顺序,即与索引器相同的顺序: list[0]list[1]list[2]等。

我不相信它是明确记录的 - 至少,我没有找到这样的文件 - 但我认为你可以把它当作保证。 对该顺序的任何更改都会毫无意义地破坏所有类型的代码。 事实上,我会惊讶地看到IList<T>任何实现违背了这一点。 不可否认,看到它具体记录下会很高兴......

在您的链接中,接受的答案在C#语言规范版本3.0,第240页中说明

foreach遍历数组元素的顺序如下:对于单维数组,元素以递增的索引顺序遍历,从索引0开始并以索引Length - 1结束。对于多维数组,遍历元素这样最右边的尺寸的索引首先增加,然后是下一个左边的尺寸,依此类推到左边。 以下示例按元素顺序打印出二维数组中的每个值:

 using System; class Test { static void Main() { double[,] values = { {1.2, 2.3, 3.4, 4.5}, {5.6, 6.7, 7.8, 8.9} }; foreach (double elementValue in values) Console.Write("{0} ", elementValue); Console.WriteLine(); } } 

产生的输出如下:1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9在示例中

 int[] numbers = { 1, 3, 5, 7, 9 }; foreach (var n in numbers) Console.WriteLine(n); the type of n is inferred to be int, the element type of numbers. 

顺序由迭代器定义,迭代器用于使用foreach循环遍历数据集合。

如果您使用的是可索引的标准集合(例如List),那么它将遍历从索引0开始并向上移动的集合。

如果您需要控制排序,您可以通过实现自己的IEnumerable来控制如何处理集合的迭代,或者您可以在执行foreach循环之前按照您希望的方式对列表进行排序。

这解释了Enumerator如何为通用List工作。 首先,当前元素未定义,并使用MoveNext到达下一个项目。

如果您阅读MoveNext,则表示它将从集合的第一个元素开始,然后从那里移动到下一个元素,直到它到达集合的末尾。

List<T>枚举器的Microsoft Reference Source页面上 ,明确声明迭代从0到Length-1完成:

internal Enumerator(List<T> list) {
    this.list = list;
    index = 0;
    version = list._version;
    current = default(T);
}

public bool MoveNext() {

    List<T> localList = list;

    if (version == localList._version && ((uint)index < (uint)localList._size)) 
    {                                                     
        current = localList._items[index];                    
        index++;
        return true;
    }
    return MoveNextRare();
}

希望它仍然适合某人

我只需要做一些类似于快速破解代码的东西,虽然它不适用于我试图做的事情,它为我重新排序列表。

使用LINQ更改顺序

         DataGridViewColumn[] gridColumns = new DataGridViewColumn[dataGridView1.Columns.Count];
         dataGridView1.Columns.CopyTo(gridColumns, 0); //This created a list of columns

         gridColumns = (from n in gridColumns
                        orderby n.DisplayIndex descending
                        select n).ToArray(); //This then changed the order based on the displayindex

列表似乎按照它们在后备存储中的顺序返回项目 - 因此如果它们以这种方式添加到列表中,则它们将以这种方式返回。

如果您的程序取决于排序,您可能希望在遍历列表之前对其进行排序。

线性搜索有些愚蠢 - 但如果您需要某种方式订单,那么最好的选择就是按顺序制作商品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM