Por que não existe uma implementação genérica do OrderedDictionary no .net?


26

Por que a Microsoft não forneceu implementação genérica do OrderedDictionary?

Já vi algumas implementações personalizadas, incluindo: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

Mas por que a Microsoft não o incluiu na biblioteca .net base? Certamente eles tinham uma razão para não construir um genérico ... mas o que é?

Antes de postar esta mensagem, eu vi: /programming/2629027/no-generic-implementation-of-ordereddictionary

Mas isso apenas confirma que não existe. Não é por isso que não existe.

obrigado


2
Sempre há SortedDictionary<TKey, TValue>: msdn.microsoft.com/pt-br/library/f7fta44c.aspx
Travis Gockel

2
A menos que eu entenda mal os documentos do SortedDict, não é isso que eu quero. Eu não quero nenhuma classificação feita. Eu só quero uma matriz que eu também possa acessar por chave. Enfim, eu estou realmente me perguntando por que a MS pulou isso. (
Edições

O que é um caso de uso típico para um dicionário ordenado? Estou lutando para pensar em um em cima da minha cabeça.
precisa saber é o seguinte

1
@Carson sempre que você tiver um conjunto de itens de dados aos quais também precisará de acesso aleatório rápido. Simplesmente armazenar em um Dict perde as informações de pedido e o uso de uma matriz exige que você mantenha seu próprio índice.
nonot1 3/11/10

2
Peça a Eric Lippert para ler e responder à sua pergunta. Ele geralmente é muito bom em ajudar com esse tipo de pergunta. Eu acho que você pode contatá-lo através de seu blog: blogs.msdn.com/b/ericlippert
devuxer

Respostas:


17

Em C # 4.0, em poucas palavras , li o seguinte:

  1. An OrderedDictionaryé uma combinação de a HashTableeArrayList
  2. Não existe genérico ArrayList
  3. "A ArrayListclasse não genérica é usada principalmente para compatibilidade com versões anteriores do Framework 1.x ..."
  4. "Um ArrayListé funcionalmente semelhante a List<object>"
  5. "A reflexão é mais fácil com um não genérico do ArrayListque com um List<object>"

Conclusão?

Nenhum genérico OrderedDictionaryporque sua construção subjacente é uma classe (não oficial) depreciada que não possui uma versão genérica.


4
Isso realmente não responde à pergunta. Obviamente, um OrderedDictionary genérico pode ser construído em um dicionário genérico e em uma lista genérica.
precisa saber é o seguinte

Um preceito do uso da classe é se a interface do usuário não muda quem se importa com a implementação? Bem, a equipe de design / compilador de linguagem, digamos, pode preferir o genérico que herda sua contraparte não genérica . Meu senso de aranha confunde. Para iniciantes: diferentes ancestrais (imediatos) são uma mina terrestre em algum lugar no caminho evolutivo para OrderedDictionarycovariância e contra-variância?
radarbob 15/04

15

A OrderedDictionarysobrecarga sobrecarrega a operação de indexação para que a indexação com um número inteiro Ncoloque o item na posição N, enquanto a indexação com um Objectrecuperará o item correspondente a esse objeto. Se alguém criar um OrderedDictionary<int, string>chamado myDicte adicionar itens (1, "George") e (0, "Fred") nessa ordem, myDict[0]retornará "George" ou "Fred"?

Esse problema poderia ter sido resolvido impondo uma restrição de classe ao tipo de chave. Por outro lado, grande parte da utilidade de coleções genéricas decorre de sua capacidade de trabalhar com eficiência com tipos de valor. A imposição de uma restrição de classe ao tipo de chave pareceria um pouco feia.

Se a classe não tivesse que ser compatível com CLS, mas tivesse apenas que trabalhar com vb.net, um design sensato poderia ser o de usar propriedades indexadas nomeadas. Assim, no exemplo acima, myDict.ByKey[0]teria produzido "Fred" e myDict.BySequence[0]teria "George". Infelizmente, idiomas como C # não oferecem suporte a propriedades indexadas nomeadas. Embora alguém possa ter julgado algo para permitir o uso da sintaxe acima, mesmo sem essas propriedades, a infeliz decisão de agrupar os campos de estruturas como Pointe Rectanglesignifica que, para myDict.ByKey[0] = "Wally"funcionar, myDict.ByKeyteria que retornar um novo objeto de classe. Uma estrutura seria mais eficiente, mas os compiladores rejeitariam o que parecia ser uma gravação em uma estrutura somente leitura (apesar de a propriedade não modificar a estrutura retornada porByKey, mas modifique a coleção à qual ele contém uma referência).

Pessoalmente, acho que um objeto dicionário-ish que foi especificado para acompanhar a ordem de inserção seria uma coisa agradável de se ter; Eu também gostaria de ter um objeto dictionary-ish que possa retornar facilmente a chave associada a uma chave específica (de modo que, por exemplo, se alguém tiver um dicionário que não diferencia maiúsculas de minúsculas e tenha adicionado um registro com a chave "GEORGE", um poderia perguntar ao dicionário qual chave está associada a "George" sem precisar pesquisar todos os KeyValuePairobjetos retornados em uma enumeração.


3

Como a manutenção da ordem evita a pesquisa O (1) que o IDictionary implica, a menos que você agrupe duas coleções (uma para ordem e outra para pesquisa), o que torna a adição / remoção de menos desempenho e aumenta o uso de memória. Ou você pode ter uma pesquisa mais lenta em troca de menos uso de memória.

Meu palpite é que não havia uma opção 'claramente melhor' aqui, por isso não foi incluída na biblioteca padrão. Especialmente por volta de 2.0, o C # ainda estava aprendendo com os erros do Java. Não ficaria surpreso se a abordagem "tudo e a pia da cozinha" de Java em coleções em sua biblioteca padrão também fosse vista como algo a ser evitado.


1
Ter uma pesquisa mais lenta em troca de menos memória efetivamente torna o OrderedDictionarya List. Eu imagino que qualquer pessoa com um caso de uso legítimo para um OrderedDictionaryestá usando-o especificamente porque precisa de uma classe de coleção que tenha pesquisa O (1), mas também se lembra da ordem de inserção; nesse caso, o uso de memória adicional é inevitável e, portanto, aceitável.
Abion47
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.