[英]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>
总是按其索引的顺序迭代。 但我仍然希望看到明确的文档和平,这与List
上的Java文档类似。
基本上由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.