A declaração .NET forEach é garantida para iterar uma coleção na mesma ordem em que foi construída?

StackOverflow https://stackoverflow.com/questions/612486

  •  03-07-2019
  •  | 
  •  

Pergunta

Um colega de trabalho usou um loop para iterar uma lista em algum código C# que ele escreveu e deixou o comentário: "Não usei para cada um porque eu não tinha certeza de que ele itera em ordem. Quem sabe o que a Microsoft fará". Por exemplo, suponha que tenhamos uma lista construída assim:

var someList = new List<string>();

someList.Add("one");
someList.Add("two");
someList.Add("three");

Meu colega de trabalho usou algo assim:

for (int i = 0; i < someList.Count; i++)    
{
    System.Diagnostics.Debug.WriteLine(someList[i]);
}

em vez disso:

foreach (var item in someList)              
{
    System.Diagnostics.Debug.WriteLine(item);
}

Eu acho que ele temo que os itens possam sair em uma ordem diferente da que foram adicionados à coleção. Eu acho que ele está sendo um pouco paranóico, mas tecnicamente, a documentação não indica a ordem em que a coleção é iterada. É possível que uma declaração foreach atravesse uma matriz ou objeto de coleta em qualquer ordem que não seja do menor limite ao mais alto?

Foi útil?

Solução

Sua pergunta é sobre um List<T>, que mantém a ordem.

For Each, sozinho, não é garantido para fazer nada. Ele apenas pede que o objeto forneça seu enumerador, o que poderia fazer qualquer coisa, potencialmente.

Outras dicas

Depende da coleção:

  • Por List<T> É garantido que seja uma ordem de inserção. (Isso está assumindo apenas Add chamadas como mostrado. Se você inserir elementos na lista em lugares específicos, eles retornariam no ponto certo que você esperaria.) Basicamente, é a mesma ordem que você receberia ao tomar list[0], list[1], list[2] etc.
  • Por Dictionary<TKey, TValue> Não há pedidos garantidos.
  • Por SortedList<TKey, TValue> (e similares) estará em ordem de comparação -chave - esse é o ponto do tipo.
  • As matrizes sempre saem em ordem de elementos.

Para responder especificamente à pergunta, "foreach" retorna a ordem que o.Getenumerator() retorna. Para listas, é a ordem em que você adicionou coisas ao fim. Para os dicionários, é provavelmente a ordem dos baldes onde as coisas foram designadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top