Minha pergunta é sobre enumerar os elementos do Dicionário
// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
// add values using add
_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");
// add values using []
_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;
// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}
Em que ordem os elementos serão enumerados? Posso forçar a ordem em ordem alfabética?
c#
.net
dictionary
ienumerable
Capitão Comic
fonte
fonte
Respostas:
A ordem dos elementos em um dicionário não é determinística. A noção de ordem simplesmente não é definida para hashtables. Portanto, não conte com a enumeração na mesma ordem em que os elementos foram adicionados ao dicionário. Isso não é garantido.
Citação do doc :
fonte
Se você quiser que os elementos sejam ordenados, use um OrderedDictionary . Um dicionário / hastable comum é ordenado apenas em algum sentido do layout de armazenamento.
fonte
Você sempre pode usar
SortedDictionary
para isso. Observe que o dicionário é ordenado por chave, por padrão, a menos que um comparador tenha sido especificado.Estou cético quanto ao uso de
OrderedDictionary
para o que você deseja, pois a documentação diz que:fonte
SortedDictionary<K,V>
é implementado como uma árvore de busca binária, o que dá às suas operações complexidade de tempo e espaço diferente em comparação com a baseada em hashtableDictionary<K,V>
. Se os usuários precisam de uma estrutura deO(1)
inserção / exclusão de hashtable e também desejam iterar sobre os elementos na ordem das chaves, então eles deveriamdict.Keys.OrderBy( k => k ).Select( k => dict[k] )
(ao custo deO(n)
espaço eO( n log n )
tempo) para oOrderBy()
(que precisará armazenar toda a coleção de chaves em uma lista interna )Os itens serão devolvidos na ordem em que foram armazenados fisicamente no dicionário, o que depende do código hash e da ordem em que os itens foram adicionados. Portanto, a ordem parecerá aleatória e, à medida que as implementações mudam, você nunca deve depender de que a ordem permaneça a mesma.
Você pode pedir os itens ao enumerá-los:
No framework 2.0, você primeiro teria que colocar os itens em uma lista para classificá-los:
fonte
Para um OrderedDictionary:
Os itens são devolvidos na ordem em que são adicionados.
fonte
Matrizes associativas (também conhecidas como tabelas de hash) não são ordenadas, o que significa que os elementos podem ser ordenados de qualquer maneira imaginável.
NO ENTANTO, você pode obter as chaves do array (apenas as chaves), ordená-las alfabeticamente (por meio de uma função de classificação) e depois trabalhar nisso.
Não posso fornecer um exemplo de C # porque não conheço a linguagem, mas isso deve ser o suficiente para que você continue.
fonte