C#中用于集合的foreach循环迭代规则

3
.NET在迭代集合时如何决定项目的顺序?
例如:
list<string> myList = new List<string>();

myList.Add("a");
myList.Add("b");
myList.Add("c");

foreach (string item in myList)
{
    // What's the order of items? a -> b -> c ?
}

我需要这个命令(访问集合成员):
for (int i = 1; i < myList.Count; i++)
{
    string item = myList[i - 1]; // This is the order I need
}

我可以安全地使用foreachList吗?其他类型的集合呢?


1
你看过这个吗:https://dev59.com/ZkbRa4cB1Zd3GeqP5fyN - Nils Magne Lunde
你说得对,我没有找到它(被投票)。 - Xaqron
5个回答

4

.NET不决定它-实现IEnumerable的类决定了如何完成它。对于List,从索引0到最后一个。对于Dictionary,我认为它取决于键的哈希值。

List索引是基于0的,所以你可以这样做:

for (int i = 0; i < myList.Count; i++)
{
    string item = myList[i]; // This is the order I need
}

这与使用foreach相同。但是如果您希望更明确一些,那就坚持使用for循环。这样也没有问题。


当然,如果您想要不同的顺序,您可以自由地扩展该类并覆盖该方法。 - Unsliced

2

我认为foreach从第一个索引开始循环,一直到列表中的最后一项。

虽然我认为使用foreach会比for i=1; i < myList.count方法慢一些,但你可以放心地使用它。

另外,我认为通常情况下你应该从索引0开始。例如:

for (int i = 0; i < myList.Count -1 ; i++)
{   
 string item = myList[i]; // This is the order I need
}

1

foreach很好。只有在寻求性能(例如数字计算)时,您才应该深入了解循环的内部工作原理。


1

不用担心,使用foreach。

List myList = new List();
myList.Add("a"); myList.Add("b"); myList.Add("c");
foreach (string item in myList) { // 它是正确的顺序! a -> b -> c ! }

0

一个通用的列表将按照添加的顺序进行枚举,正如您所建议的那样。其他枚举器的实现可能会有所不同,如果这很重要,您可以考虑使用 SortedList。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接