2009-01-06 6 views
2

Quelle est la meilleure façon de conserver un objet-collection (Liste dans l'exemple) dans une situation clé/valeur, où la clé est un ID et la valeur est une collection d'un type T?Meilleure façon d'utiliser une liste <T> dans une collection Key/Value?

Est-ce la seule option ou existe-t-il une meilleure solution/une autre collection pour cela dans .NET 3.5?

var x = new Dictionary<int, List<type>>(); 
+1

Vous voulez dire var x = new Dictionnaire >(); ? – tuinstoel

+0

La question est un peu floue, pourriez-vous la reformuler? Demandez-vous si Dictionary est une bonne collection pour conserver les clés et les valeurs? – dalle

Répondre

3

Ceci est une bonne solution et fonctionnera plutôt bien - vous utilisez effectivement un objet dictionnaire de {key = int, value = 4 byte reference}.

Lorsque vous récupérez une valeur par la clé, vous récupérez la référence au List<T> sur le tas et vous pouvez l'utiliser. Ce sera une solution très efficace et compacte à votre problème apparent.

0

Je ne sais pas si cela est ce que vous avez besoin, mais je vais avoir côtelette à elle.

public Dictionary<int,List<T>> myFunction<T>() 
{ 
    var returnvalue = new Dictionary<int,List<T>>(); 
    //Do some stuff with the collection. 
    return returnvalue; 
} 

que vous pouvez ensuite appeler

public void Main() 
{ 
    var functionreturn = myFunction<String>(); 
} 

Je ne suis pas sûr que cela vous aidera ou non, mais il peut vous aider à reformuler votre question.

REMARQUE: Ce qui précède est le code de l'air et n'a pas été testé.

+0

-1 pour le code aérien. Mieux vaut tester puis poster que de fournir quelque chose rapidement. –

0

Je ne pense pas qu'il y ait quelque chose dans le cadre, mais je pense qu'il y a une collection MultiDictionary dans la bibliothèque PowerCollections. Tu pourrais essayer ça.

+0

Merci. Je vais regarder. – robertpnl

0

Je pense que vous devriez probablement écrire votre classe d'emballage en fonction de vos besoins. Je veux dire, si vous avez besoin de stocker un dictionnaire de listes pré-faites, Dictionary<int, List<type>> devrait être bien tant que c'est seulement une propriété privée. Vous ne devriez pas l'exposer publiquement car il expose évidemment trop d'informations et vous ne pouvez pas l'afficher en IDictionary<int, IList<T>> ou quelque chose de similaire à cause du manque de covariance.

Votre meilleur pari serait quelque chose comme ça:

class MyWrapper<T>() 
{ 
    private Dictionary<int, List<T>> dictionary { get; set; } 
    public MyWrapper() { dictionary = new Dictionary<int, List<T>>(); } 

    // Adds a new item to the collection 
    public void Add(int key, T item) 
    { 
     List<T> list = null; 
     if (!dictionary.TryGetValue(key, out list)) 
     { 
      // If dictionary does not contain the key, we need to create a new list 
      list = new List<T>(); 
      dictionary.Add(key, list); 
     } 
     list.Add(item); 
    } 

    public IEnumerable<T> this[int key]  
    { 
     get 
     { 
      List<T> list = null; 
      // We just return an empty list if the key is not found 
      if (!dictionary.TryGetValue(key, out list)) return new List<T>(); 
      else return list; 
     } 
    } 
} 

De toute évidence, vos besoins peuvent être différents, vous devrez peut-être mettre en œuvre deux interfaces, etc., mais cela est l'idée générale.

+0

Merci pour vos conseils et votre code. – robertpnl

0

Vous êtes à la recherche d'un dictionnaire multi-valeurs, à savoir une collection à clé, où chaque touche peut avoir plusieurs valeurs? PowerCollections a un tel MultiDictionary.

Questions connexes