it-swarm-fr.com

Pourquoi n'y a-t-il pas d'implémentation générique de commande ordonnée dans .net?

Pourquoi Microsoft n'a-t-il pas fourni de mise en œuvre générique de commande ordonnée?

Il y a quelques implémentations personnalisées que j'ai vues, notamment: http://www.codeproject.com/kb/recipes/genericericopeddictionary.aspx

Mais pourquoi Microsoft ne l'a-t-il pas inclus dans la base de la base ?NET? Ils avaient sûrement une raison de ne pas construire un générique ... mais qu'est-ce que c'est?

Avant de poster ce message, j'ai vu: https://stackoverflow.com/questions/2629027/NO-Generic-Implementablement-of-Oformeddiction

Mais cela confirme simplement que cela n'existe pas. Non Pourquoi Il n'existe pas.

Merci

26
nonot1

Dans C # 4.0 en un mot J'ai lu ceci:

  1. Un OrderedDictionary est une combinaison d'un HashTable et ArrayList
  2. Il n'y a pas de générique ArrayList
  3. "La classe Nongéneric ArrayList est principalement utilisée pour la compatibilité arriérée avec le cadre 1.x ..."
  4. "Un ArrayList est fonctionnel similiaire à List<object> "
  5. "La réflexion est plus facile avec un nongénère ArrayList d'un List<object> "

Conclusion?

Aucun générique OrderedDictionary parce que c'est la construction sous-jacente est une classe (non officiellement) dépréciée qui n'a pas de version générique elle-même.

17
radarbob

Le OrderedDictionary surcharge l'opération d'indexation de sorte que l'indexation avec un entier N _ obtiendra l'élément en position N, tandis que l'indexation avec un Object va récupérer l'élément correspondant à cet objet. Si on devait créer un OrderedDictionary<int, string> appelé myDict et éléments ajoutés (1, "George") et (0, "Fred") dans cet ordre, devrait myDict[0] Retourner "George" ou "Fred"?

Un tel problème aurait pu être résolu en imposant une contrainte de classe sur le type de clé. D'autre part, une grande partie de l'utilité des collections génériques découle de leur capacité à travailler efficacement avec des types de valeur. Imposer une contrainte de classe sur le type de clé semblerait un peu laid.

Si la classe n'avait pas besoin d'être conforme à CLS, mais simplement de travailler avec vb.net, une conception sensible aurait pu être utilisée des propriétés indexées nommées. Ainsi, dans l'exemple ci-dessus, myDict.ByKey[0] aurait donné "Fred", et myDict.BySequence[0] aurait donné "George". Malheureusement, des langues comme c # ne supportent pas les propriétés indexées nommées. Tandis que l'on aurait pu avoir kovegged quelque chose pour permettre l'utilisation de la syntaxe ci-dessus, même sans ces propriétés, la décision malheureuse d'envelopper les champs des structures telles que Point et Rectangle signifie que pour myDict.ByKey[0] = "Wally" travailler, myDict.ByKey devrait retourner un nouvel objet de classe. Une structure serait plus efficace, mais les compilateurs rejeteraient ce qui ressemblait à une écriture à une structure en lecture seule (malgré que la propriété ne modifierait pas la structure renvoyée par ByKey, mais modifiera plutôt la collection à laquelle elle détient une référence).

Personnellement, je pense qu'un objet Dictionary-ISH qui a été spécifié comme le suivi de l'ordonnance d'insertion serait une bonne chose à avoir; J'aimerais également avoir un objet de dictionnaire-ish qui pourrait facilement renvoyer la clé associée à une clé particulière (de sorte que, par exemple, si l'un a un dictionnaire insensible à une casse et a ajouté un enregistrement avec une clé de "George", une pourrait demander au dictionnaire quelle clé est associée à "George" sans avoir à rechercher à travers tous les objets KeyValuePair renvoyés dans une énumération.

16
supercat

Parce que le maintien de la commande empêche le O(1) Recherche que l'incitingage implique que si vous enveloppez deux collections (une pour la commande, une pour la recherche), ce qui fait ajouter/supprimer moins performant et augmente l'utilisation de la mémoire. Ou Vous pourriez avoir une recherche plus lente en échange de moins d'utilisation de la mémoire.

Je suppose qu'il n'y avait pas de choix "clairement meilleur" ici, il n'y a donc pas entré dans la bibliothèque standard. En particulier vers 2,0, C # apprenait toujours des erreurs de Java. Je ne serais pas surpris si l'approche de Java 'tout et de l'évier de la cuisine "des collections dans leur bibliothèque standard était considérée comme quelque chose à éviter.

4
Telastyn