Welcome to MSDN Blogs Sign in | Join | Help

News


  • Locations of visitors to this page
Astuce: faciliter la lecture des données d'un dictionnaire grâce à une méthode d'extension

Une petite pour la route: j'en avais vraiment marre de tester à chaque fois .ContainsKey() depuis un dictionnaire avant de lire une valeur.

Dictionary<string, string> dico; if (dico.ContainsKey("key")) value = dico["key"]; else value = "default";

Une petite méthode d'extension de C# 3.0 d'une simplicité incroyable permet de régler ça facilement:
public static class MyExtensions { public static TValue GetValue<TKey, TValue>( this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue) { if (source.ContainsKey(key)) return source[key]; else return defaultValue; } }

L'appel depuis n'importe quel dictionnaire devient évidemment très simple !!!

value = dico.GetValue("key", "default");
 
Parfois, on se demande juste comment on y avait pas pensé avant...
Posted: Wednesday, May 07, 2008 11:53 AM by mitsu
Filed under:

Comments

Romain said:

Tiens, en parlant de dictionnaire, aurais-tu une astuce pour utiliser null en tant que clé ?

Dictionary<TKey,TValue> et Hashtable ne le permettent pas.

# May 7, 2008 10:28 AM

jbevain said:

Pour ça il y a la méthode TryGetValue, qui en plus, a le mérite d'éviter un double lookup (ContainsKey + get_Item).

# May 7, 2008 10:38 AM

mitsu said:

Tout à fait JB !

Mais j'aime pas cette syntaxe avec le paramètre en 'out'. Le prototype de fonction que j'ai utilisé (avec defaultValue) permet qu'on l'appelle dans une expression ce qui est pratique. Par contre j'aurais dû utiliser le TryGetValue dans l'implémentation interne.

A la rigueur on peut inclure le TryGetValue dans une expression en utilisant l'opérateur ternaire (?:) mais niveau lisibilité c'est un peu hard et on a toujours le paramètre en 'out' a devoir déclarer...

# May 9, 2008 3:17 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker