Disons que j'ai une classe simple Cat
en C#, avec une propriété Name
de type string
. Maintenant, j'ai besoin d'une classe de collection pour mes chats, donc je décide d'envelopper un Dictionary<string, Cat>
dans une classe de collection personnalisée. En fait, cette classe contient une variable dictionnaire privé et ajoute ou supprime les membres de la collecte, au besoin, ainsi que les chats d'indexation par leur nom:Gestion des clés de collection mutables en C#
class Cats
{
private Dictionary<string, Cat> m_dic = new Dictionary<string,Cat>();
public void Add(Cat c)
{
m_dic.Add(c.Name, c);
}
public void Remove(string name)
{
m_dic.Remove(name);
}
public Cat this[string name]
{
get
{
return m_dic[name];
}
}
}
Maintenant, je peux créer une collection et des chats, comme ceci:
Cats cs = new Cats();
cs.Add(new Cat("Valentina"));
cs.Add(new Cat("Sophie"));
cs.Add(new Cat("Tomboy"));
Et je peux récupérer un chat de son nom:
Cat c1 = cs["Sophie"];
Tout cela est très bon. Le problème est, quand je change le nom d'un chat, comme ceci:
c1.Name = "Sofia";
... la clé de collection pour l'objet visé par c1
n'est pas mis à jour, évidemment. Donc, si je tente de récupérer le même élément en utilisant son nouveau nom, je reçois une exception:
Cat c2 = cs["Sofia"]; //KeyNotFoundException is thrown here.
Ce comportement est correct et évidente par le moteur d'exécution. Ma question est: pouvez-vous suggérer une méthode élégante et fiable pour modifier les clés de collection chaque fois que la propriété de nom d'un élément change?
Mon objectif est de pouvoir récupérer, à tout moment, un objet de son nom, comme vous pouvez l'imaginer. J'ai abordé le problème en ayant le setter de la propriété Name
déclencher un événement afin que toute collection contenant cet objet puisse mettre à jour la clé correspondante. Cette méthode est assez lourde et pas très efficace, cependant.
Pouvez-vous penser à quelque chose de mieux? Je vous remercie.
S'il vous plaît voir l'edit à mon poste ci-dessous. –