.NET Dictionnaire: obtenir ou de créer de nouvelles
Je me retrouve souvent à la création d'un Dictionnaire
avec un non-trivial de valeur classe (par exemple List
), puis écrit toujours le même modèle de code lors du remplissage des données.
Par exemple:
var dict = new Dictionary<string, List<string>>();
string key = "foo";
string aValueForKey = "bar";
Qui est, je veux insérer "bar"
dans la liste qui correspond à la clé "foo"
, où les principaux "foo"
peut pas être mappé à quoi que ce soit.
C'est là que j'utilise le jamais-motif répété:
List<string> keyValues;
if (!dict.TryGetValue(key, out keyValues))
dict.Add(key, keyValues = new List<string>());
keyValues.Add(aValueForKey);
Est-il une façon plus élégante de le faire?
Liées à des questions qui n'ont pas de réponses à cette question:
- Est-il un IDictionary de mise en œuvre qui renvoie la valeur null sur la clé manquante au lieu de les jeter?
- Trouver-ou-insert avec une seule recherche dans c# dictionnaire
- Dictionnaire de retourner une valeur par défaut si la clé n'existe pas
- Si la clé existe, mais la Liste est nulle?
- Généralement j'avais pense que l'ajout d'une valeur null être considérés comme inappropriés et que vous attendez le code juste de la bombe et corriger le bug de l'ajout d'une clé null, de ne pas essayer de la traiter ici.
- ok, mais si nous obtenons une Liste de résultats à partir d'un tiers de la source? La seule chose à faire face est de gérer les valeurs null, ai-je tort? Il m'arrive tous les jours 🙂
- Alors vous devriez être null vérification de la liste renvoyée ailleurs avant de l'ajouter dans le dictionnaire pour s'assurer que vous n'ajoutez pas de valeur null.
- bien sûr, null de la vérification de la bonne façon, mais que faire si notre Dictionnaire vient de tiers? Ok, ce scénario n'est pas une fois que décrit ici, mais je préfère un générique à l'épreuve des balles méthode.
- Alors je serais probablement juste de ne pas utiliser une méthode comme cela dans les rares cas limite de l'utilisation d'un troisième partie du code avec un particulier novice au niveau de bug. Il est incroyablement peu probable que cela arrive, incroyablement facile à trouver quand il le fait (le pointeur null exceptions se démarquer), et incroyablement facile à corriger (seulement ajouter dans le simple null vérifier). Si vous voulez vraiment la méthode elle-même à faire le nul de vérifier, par tous les moyens l'ajouter dans lorsque vous utilisez la méthode, vous êtes libre de le faire. J'ai expliqué pourquoi je pense qu'il serait nuisible dans mon code, mais si vous savez que ça ne s'applique pas à votre base de code, c'est très bien.
- ok, je suis d'accord. J'utilise souvent TryDoSomething méthodes avec une valeur null de vérifier de retour faux et je ne pense pas que c'est une mauvaise approche. Lorsque cela est possible je fais toujours mes vérifier avant chaque genre de méthode/fonctionnement/fonction, mais je ne me sens jamais bien sûr dû à noob de la troisième partie du code 🙂 Merci pour le partage de votre point de vue.
- Connexes: stackoverflow.com/questions/3705950/...
Vous devez vous connecter pour publier un commentaire.
Nous avons un peu différentes à ce sujet, mais l'effet est similaire:
Appelé:
Il fait usage de la contrainte générique pour le public sans paramètre constructeurs:
where TValue : new()
.Pour aider avec la découverte, à moins que la méthode d'extension est tout à fait spécifique à une étroite problème, nous avons tendance à placer des méthodes d'extension dans l'espace de noms du type qu'elles étendent, dans ce cas:
La plupart du temps, la personne utilisant le type a la
using
déclaration définies dans la partie supérieure, de sorte IntelliSense trouvez également l'extension des méthodes pour elle définis dans votre code.HashSet
et d'autresDictionary<>
éléments). Je ne me souviens plus de la raison exacte, mais je pense que, leList<>
contient également un type générique, faisant de cette façon joue plus agréable avec l'inférence de type.List<>
version, nous avons eu et il n'a plus l'usage, il est fonctionnellement identique à la norme ci-dessus. Donc je l'ai enlevé. Il doit avoir été laissé par accident que je codais le premier tour.TValue
public le constructeur sans paramètre.Comme c'est le cas de nombreux problèmes de programmation, lorsque vous vous retrouver à faire quelque chose de beaucoup, refactoriser le code dans une méthode:
ICollection
. Le principal point d'être à la maison le code dans un emplacement séparé pour le ré-utiliser. Je ne pense pas qu'il cherchait à améliorer la déjà le code fourni.Dictionary<TKey, SomeCollection>
je ne suis pas souvent à l'ajout de plusieurs valeurs pour la même clé, tout à la fois. Si c'est quelque chose qui arrive souvent, vous pouvez ajouter une autre surcharge dans laquelle vous acceptez uneIEnumerable<TValue>
et simplement tous les ajouter dans la méthode.Ok, approche différente:
De cette façon, vous avez à "essayez d'ajouter" votre valeur à une Liste générique de (forcément généralisables à une collection générique), null vérifier et essayer d'obtenir des clés/valeurs dans votre Dictionnaire.
Utilisation et exemple:
Espère que cela aide.
Et que dire de cela?