Dictionnaire ou KeyedCollection?

J’ai une classe ( SomeClass ) qui contient une propriété Name du type de ssortingng . Et je dois stocker un tableau de cette classe et trouver ses éléments par leurs noms. Pour cela, il existe deux types de collections: KeyedCollection et Dictionary . Ma question est la suivante: quelle différence entre eux et dans ce cas? Il est préférable d’utiliser KeyedCollection et Dictionary ? Merci pour toute aide dans l’explication.

Aucun des commentaires précédents ne traite de la différence la plus importante entre les deux: KeyedCollection conserve vos éléments dans l’ordre dans lequel ils ont été ajoutés (le premier élément ajouté est à l’index 0 et le dernier ajouté au dernier index). Dictionary ne le fait pas (ou du moins il n’est jamais garanti de le faire).

Cet avantage supplémentaire de KeyedCollection a un faible coût de performance. Sous les couvertures, vous payez le coût de la maintenance d’un dictionnaire et d’une liste.

Voici une bonne explication concernant les différences entre Dictionary et KeyedCollection: http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

Les points principaux sont:

  • KeyedCollection est abstrait, vous ne pouvez donc pas l’utiliser directement.
  • KeyedCollection est utile pour les cas où key est dans l’entité elle-même, vous pouvez alors encapsuler la récupération de clé dans l’implémentation de la collection.
  • Il existe des implémentations génériques pour KeyedCollection (mais pas dans le framework), qui vous permettent de coller le délégué de récupération de clé dans le constructeur de la collection. Vous n’avez donc pas à le répéter chaque fois que vous ajoutez un élément.

Par défaut, KeyedCollection crée un dictionnaire sous les couvertures.
Si la clé a également un sens en tant que partie de la valeur et définit également l’unicité alors c’est le but d’une collection de clés.

Si vous souhaitez modifier le support du dictionnaire, utilisez ce moteur:

 protected KeyedCollection( IEqualityComparer comparer, int dictionaryCreationThreshold) 

Un KeyedCollection permet des clés mutables et des moyens de gérer le changement de clé. Dictionary n’autorise pas les modifications de clé. Deuxièmement, si vous avez une collection qui nécessite une recherche, la logique pour extraire la clé de l’entité rest à un endroit – alors que la maintenance du dictionnaire devra placer une logique d’extraction de clé à chaque endroit où des éléments sont ajoutés / supprimés du dictionnaire.

Un KeyedCollection doit être utilisé lorsque la clé est sur l’élément lui-même.

Par défaut, KeyedCollection est un wrapper Collection autour d’un dictionnaire. Lorsque vous utilisez de petites collections et / ou que vous préférez récupérer directement des éléments, KeyedCollection fournit un constructeur qui KeyedCollection un paramètre dictionaryCreationThreshold , qui indique le nombre de collections à utiliser pour Dictionary .
Un autre aspect de KeyedCollection est que vous pouvez choisir de changer la propriété de la clé (à condition que leurs types correspondent). Cela peut être bon pour les éléments à double clé, etc. En termes de performances, je ne pense pas que l’enveloppement d’un dictionnaire ait beaucoup de temps, sauf si vous générez un grand nombre d’instances KeyedCollection ou si vous utilisez il y a un dictionnaire).
Une chose que j’espère voir dans KeyedCollection est de la KeyedCollection , mais vous pouvez créer un type de béton générique tout aussi facilement.

Vous ne pouvez pas utiliser KeyedCollection car il s’agit d’un résumé: http://msdn.microsoft.com/en-us/library/ms132438.aspx . Cela signifie que vous ne pouvez pas en créer un object.