2010-01-25 8 views
2

Dans la solution que j'ai élaborée à cette question =>General type conversion without risking Exceptions (Voir la modification au bas de la question), je dois mettre en cache une méthode de conversion entre deux types. Donc, étant donné Type1 et Type2 j'ai besoin de récupérer une méthode.Collection avec deux clés

Dans la réponse à cette question =>What is the best C# collection with two keys and an object?, il est recommandé d'utiliser un dictionnaire de dictionnaires. C'est similaire à ce que je fais.

Mais je ne l'aime pas. Il ne circule pas logiquement avec ce que la collection est censée représenter. Aussi pour récupérer une valeur que j'ai à faire:

 if (!_Types.ContainsKey (s.GetType())) 
     { 
      type1Cache = new Dictionary<Type, ConversionCache>(); 

      _Types.Add (s.GetType(), type1Cache); 
     } 
     else 
     { 
      type1Cache = _Types[s.GetType()]; 
     } 

     if (!type1Cache.ContainsKey (value.GetType())) 
     { 
      // We havent converted this type before, so create a new conversion 
      type2Cache = new ConversionCache (s.GetType(), value.GetType()); 

      // Add to the cache 
      type1Cache.Add (value.GetType(), type2Cache); 
     } 
     else 
     { 
      type2Cache = type1Cache[value.GetType()]; 
     } 

qui est un peu long vent.

Je veux juste faire quelque chose comme

 if (!_Types.ContainsKey (s.GetType(), value.GetType())) 
     { 
      cache = new ConversionCache (s.GetType(), value.GetType()); 

      _Types.Add (s.GetType(), value.GetType(), cache); 
     } 
     else 
     { 
      cache = _Types[s.GetType(), value.GetType()]; 
     } 

Une solution serait de concaténer les valeurs de chaîne des types. Quelque chose comme:

 if (!_Types.ContainsKey (s.GetType().ToString() + ":" + value.GetType().ToString())) 
     { 
      cache = new ConversionCache (s.GetType(), value.GetType()); 
      _Types.Add (s.GetType().ToString() + ":" + value.GetType().ToString(), cache); 
     } 
     else 
     { 
      cache = _Types[s.GetType().ToString() + ":" + value.GetType().ToString()]; 
     } 

Je sais que cela fonctionnerait dans ce cas parce qu'il ya un à un entre un type et sa représentation de chaîne.

Mais cela sent très mauvais, et ne fonctionnerait pas dans d'autres situations.

Y a-t-il une meilleure façon de procéder?

Répondre

1

La façon dont vous le faites est très bien. Si vous voulez un meilleur système "odorant" tout ce dont vous auriez besoin est une fonction d'assistance qui prend deux entrées (ou types) et renvoie une chaîne unique. Ensuite, les détails d'implémentation de la génération de la clé (dans ce cas, les concaténer avec un séparateur ":") sont masqués.

Cela me semble un peu trop technique. Je ne crois pas qu'il y ait une grande chance que vous deviez changer cette méthode de génération de clé et vous n'essayez pas de créer une classe générique. De toute évidence, vous auriez besoin de le faire avec un cours générique.

2

Vous pourriez avoir besoin de Tuples (dans .Net 4) ou de la célèbre classe "Pair" dans les versions précédentes: KeyValuePair. Mais en pensant à vos besoins, j'irais probablement pour un cours personnalisé. Vous pouvez vous assurer que hashcode/equal fait ce que vous voulez, peut surcharger ToString() pour une journalisation sensée et il se lit probablement beaucoup mieux de toute façon.

Questions connexes