Question

Quel est le meilleur moyen 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 de type T?

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>>();
Était-ce utile?

La solution

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

Lorsque vous récupérez une valeur à l'aide de la clé, vous récupérez la référence à la Liste < T > du tas et pourrez l'utiliser. Ce sera une solution très efficace et compacte à votre problème apparent.

Autres conseils

Je ne sais pas si c'est ce dont vous avez besoin, mais je vais devoir m'en occuper.

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 sais pas si cela vous aidera ou non, mais cela peut vous aider à reformuler votre question.

REMARQUE: ce qui précède est un code aérien et n’a pas été testé.

Je ne pense pas qu'il y ait quoi que ce soit dans le cadre, mais je pense qu'il existe une collection MultiDictionary dans la bibliothèque PowerCollections. Vous pouvez essayer ça.

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édéfinies, Dictionnaire Liste, > > devrait convenir tant qu'il ne s'agit que d'une propriété privée. Vous ne devez pas l'exposer publiquement, car il expose manifestement trop d'informations et vous ne pouvez pas le convertir en IDictionary < int, IList & Lt; T > ou quelque chose de similaire en raison 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;
       }
    }
}

Évidemment, vos besoins peuvent être différents, vous devrez peut-être implémenter quelques interfaces, etc., mais c'est l'idée générale.

Si votre ID est un membre de votre type, vous pouvez envisager de mettre en place un . System.Collections.ObjectModel.KeyedCollection < TKey, TItem >

Recherchez-vous un dictionnaire à plusieurs valeurs, c'est-à-dire une collection à clé, dans laquelle chaque clé peut avoir plusieurs valeurs? PowerCollections possède un tel MultiDictionary.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top