2010-08-02 3 views
1

Mes besoins:Liste, SortedList, Dictionnaire pour stocker des objets par clé et les sérialiser?

  • je dois stocker une collection d'objets dans une classe,
  • objets

    doivent être accessibles par leur clé (qui sera chaîne unique), recherche/supprimer/remplacer doit fonctionner comme ce

    MyClass somethingNew = new MyClass(); 
    // set someproperties on somethingNew  
    somethingNew.Id = "FooBar";  
    // theOtherObject already contains an object with the key "FooBar"  
    theOtherObject.Members[somethingNew.Id] = somethingNew; 
    
  • lorsque nouvel objet est inséré aucune sorte ne doit se produire,

  • la propriété (collection) doit être sérialisable nous XML DataContractSerializer.

Alors, que choisir pour la propriété Membres? Je suppose que la liste et SortedList sont hors de question, donc je suis sur le point d'utiliser générique

Dictionary<string, MyClass>. 

Est-ce la bonne décision? Supporte-t-il la sérialisation?

Répondre

2

Dictionary<string, MyClass> est l'option correcte dans ce cas.

Et oui, il est Serializable.

3

Une autre classe que vous pouvez envisager KeyedCollection<TKey,TItem>. Il est également sérialisable.

La classe KeyedCollection est un hybride entre une collection basée sur l'interface générique IList et une collection basée sur l'interface générique IDictionary. Comme les collections basées sur l'interface générique IList, KeyedCollection est une liste indexée d'éléments. Comme les collections basées sur l'interface générique IDictionary, KeyedCollection a une clé associée à chaque élément. *

* Référencé à partir de la documentation MSDN à partir du lien ci-dessus.

Edit: Une chose à noter est que KeyedCollection<TKey,TItem> est une classe abstraite et vous aurez besoin de tirer une instance de cette classe, ex) MyClassCollection avant de pouvoir commencer à l'utiliser.

+0

-1 KeyedCollection est une classe abstraite qui ne peut pas être directement instanciée. C'est également pour un cas spécifique lorsque la clé est directement intégrée dans l'objet Value (ce qui, dans ce cas, n'est pas vrai). –

+0

Oui, je suis conscient que c'est une classe abstraite. Mais il fait ses recherches basées sur 'somethingNew.Id' de sa' MyClass'. Et si cette collection est utilisée dans de nombreux endroits de l'application, il n'y a rien de mal à créer une classe de collection dédiée 'MyClassCollection' pour gérer l'accès aux collections de ces objets. –

+0

Vous avez raison. J'ai lu le code incorrectement. Vous pouvez mettre à jour votre réponse pour inclure le fait que l'OP doit créer un type de collection personnalisé dérivé de KeyedCollection . –

Questions connexes