Pergunta

É seguro supor que os dois itterations sobre a mesma coleção irá retornar os objetos na mesma ordem? Obviamente, presume-se que a coleção de outra forma não foi alterado.

Foi útil?

Solução

A resposta curta - Sim.

Obviamente, porém, a ordem dos itens na coleção pode não ser exatamente como eles foram inseridos, dependendo do tipo de coleta (um dicionário, por exemplo).

Mas você vai obter os mesmos resultados cada vez que você iterate através de uma única coleção, não modificada usando um loop foreach.

Outras dicas

Depende do tipo de coleção. Para a maioria das coleções, a resposta é "Sim".

No entanto, isso não é garantido. Os documentos de um tipo de coleção deve especificar se ele faz, mas como a maioria faz, esse detalhe é geralmente mais parecia. No entanto, se não é estável, seria uma tremenda supervisão se os documentos não mencionou isso.

Você não pode garantir isso se você não sabe a implementação concreta da classe que você está interagindo sobre.

Colecções que têm uma ordem dos elementos definidos (por exemplo List<T>) irá enumerar numa ordem estável.

Para coleções onde o estado do objeto não muda é altamente provável que os elementos vão voltar na mesma ordem, por exemplo, Dictionary<K,V>, embora isso não garantido pela especificação.

Como um exemplo de onde este não seria o caso, você poderia imaginar uma tabela hash com base implementação de dicionário que compactos ou redimensiona a tabela de forma assíncrona. Tal implementação não garantiria uma ordem estável iteração.

Enquanto a resposta é “sim” para todas as coleções embutidas e, provavelmente, qualquer classe de coleção sã lá fora, a documentação não tem quaisquer restrições formuladas para IEnumerable. Portanto, nada nos diz que cada iteração deve ser estável.

Eu poderia imaginar o seguinte caso de uso:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

Este bem poderia ser implementado como uma classe que produz uma ordenação diferente para cada iteração.

Assim -. Se você também considerar casos limítrofes estranhos, a resposta deve ser “ não

Embora normalmente, os elementos serão devolvidos na mesma ordem, não há absolutamente nenhuma garantia. É totalmente dependente da implementação interna da classe coleção.

Eu posso ver um caso para uma classe de coleção que é especificamente projetado para retornar elementos em uma ordem aleatória, por exemplo.

Em suma, se você não sabe a implementação interna da classe coleção, não assumir nada sobre a ordem.

Linq define o IOrderedEnumerable interface para esta finalidade.

Re "não modificada" (resposta da NM) - nota que muitos recipientes complexos como dicionário não garantem a preservação da ordem. Às vezes, adicionar um item para que apareça passado (dando a impressão de que a ordem é preservada), e às vezes ele fará com que os baldes internos para re-organizar, dando uma ordem completamente diferente.

Coisas como SortedList <,> etc, obviamente, tem suas próprias regras.

Eu diria que para a maioria coleção é seguro assumir isso. Não é além dos reinos da possibilidade de que uma determinada coleção poderia ter o recenseador implementado de uma forma não-determinista, mas que provavelmente não vai acontecer ...

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