Tout ce que je veux, c'est un dictionnaire qui me dit quelle clé il ne pouvait pas trouver, plutôt que de simplement dire J'ai brièvement envisagé de faire une sous-classe avec la clé donnée n'était pas présente dans le dictionnaire code>. NOUVELLE CETTE [TLEKY KEY] CODE>, mais a senti que c'était un peu hacky, alors je suis allé avec la mise en œuvre de l'interface de la natricication et tout en faisant tout passer directement à un dictionnaire intérieur, avec la seule logique supplémentaire Être dans l'indexeur: p> public TValue this[TKey key]
{
get
{
ThrowIfKeyNotFound(key);
return _dic[key];
}
set
{
ThrowIfKeyNotFound(key);
_dic[key] = value;
}
}
private void ThrowIfKeyNotFound(TKey key)
{
if(!_dic.ContainsKey(key))
throw new ArgumentOutOfRangeException("Can't find key [" + key + "] in dictionary");
}
3 Réponses :
Si vous voulez faire cela, vous allez devoir faire rouler les vôtres d'une manière ou d'une autre. Mais je vais remettre en question pourquoi vous voudriez faire cela? P>
Eh bien, je pensais avoir dit pourquoi dans la question. Mais plutôt que d'obtenir un courrier du gars faisant la configuration en disant «quelle valeur ai-je mal auquel je me suis trompé?», Je préfère qu'il puisse la réparer lui-même.
au lieu de faire de la conception et de rechercher la présence de la clé avant de toucher le dictionnaire sous-jacent, pourquoi ne pas faire de cette façon, vous ne payez que pour la vérification supplémentaire dans le cas de défaillance - Le cas de réussite, espérons-le plus souvent, ne doit pas nécessairement faire une recherche de dictionnaire supplémentaire. C'est bon pour obtenir, mais l'ensemble est plus difficile car le comportement par défaut de l'ensemble est de toujours fonctionner. Si vous ne voulez pas que cela aurait besoin de vérifier l'existence de la clé en premier. P> p>
+1 Un gestionnaire d'exception est le meilleur moyen de gérer une condition exceptionnelle. C'est ce qu'ils sont pour. :)
@Stewart sauf si je me trompe, system.collections.generic.dictionnera code> ne jette pas une erreur dans l'indexeur lorsque la touche n'a pas été trouvée, elle est ajoutée silencieusement avec la nouvelle valeur. Votre approche fonctionnerait toujours pour le getter.
@ Georgesdupéron - Vous avez tout à fait raison. Cela ne fonctionne que dans le cas GET. Je vais modifier l'exemple. Pour le cas défini, la vérification supplémentaire est inévitable.
sonne comme un bon ajustement pour une méthode d'extension: Ceci fonctionnera ensuite sur tous vos dictionnaires existants chaque fois que vous appelez verbosegetvalue code>, par exemple: p>
Je suis tellement heureux des utilisateurs # 1 et # 2 sont sur le côté droit de la planète :)