2010-11-11 33 views
0

Je nichaient la mise en œuvre dictionnaire comme celui-ci:Wrapper pour le dictionnaire imbriqué

Dictionary<class1, Dictionary<int, class2>> 

Maintenant, je me sers cela à de nombreux endroits dans mon projet, mais je me sens laide écrire un nom long à chaque fois par exemple:

Dictionary<class1, Dictionary<int, class2>> obj1=new Dictionary<class1, Dictionary<int, class2>>(); 
Dictionary<class1, Dictionary<int, class2>> obj2=new Dictionary<class1, Dictionary<int, class2>>(); 
Dictionary<class1, Dictionary<int, class2>> obj3=new Dictionary<class1, Dictionary<int, class2>>(); 

puis-je faire une enveloppe pour ce dictionnaire afin que je puisse écrire juste comme ça pour le rendre plus lisible:

MyWrapper obj1=new MyWrapper(); 
MyWrapper obj2=new MyWrapper(); 
MyWrapper obj3=new MyWrapper(); 
+0

Excellent nom de classe!/s Sept ans plus tard, que nommez-vous cette abstraction maintenant? –

Répondre

2

j'ai écrit un emballage une fois, permet de voir, il est here.

Vous pouvez accéder à un élément par deux clés de ce type: dictionary["key1", "key2"].

1

Oui, vous pouvez:

public class MyWrapper : Dictionary<class1, Dictionary<int, class2>> 
{} 

Bien sûr, vous pouvez ajouter des méthodes à cette enveloppe qui simplifient et inserts (lookups et toute autre fonctionnalité nécessaire).

Sinon, vous pouvez utiliser le mot-clé var pour réduire certains des "bruit", sans introduire une enveloppe:

var obj1 = new Dictionary<class1, Dictionary<int, class2>>(); 

Ou, une combinaison ...

var obj1 = new MyWrapper(); 
1

Vous pouvez utiliser une classe wrapper générique mais je ne dirais pas que cela permettrait d'avoir la clarté du code. De plus, vous devrez écrire des méthodes qui donnent accès aux dictionnaires internes.

public class MyWrapper<T1, T2, T3> 
{ 
    private IDictionary<T1, IDictionary<T2, T3>> dictionary; 

    public MyWrapper() 
    { 
     dictionary = new Dictionary<T1, IDictionary<T2, T3>>(); 
    } 

    public static void Main(string[] args) 
    { 
     var myWrapper = new MyWrapper<int, string, bool>(); 
    } 
} 
3

Si vous ne voulez pas créer une enveloppe, vous pouvez créer un alias dans le haut de votre fichier .cs

using MyWrapper = 
    System.Collections.Generic.Dictionary<Namespace.class1, 
    System.Collections.Generic.Dictionary<int, Namespace.class2>>; 

Ceci est particulièrement utile si vous êtes en interaction avec d'autres classes (que vous ne 't contrôle) qui attendent ces types longs. Ensuite, vous pouvez utiliser un nom pratique dans vos fichiers, mais c'est vraiment un alias pour le type complet.

Les deux utilisations suivantes sont équivalentes.

MyWrapper w1 = new MyWrapper(); 
MyWrapper w2 = new Dictionary<class1, Dictionary<int, class2>>();