Frage

Was ist der beste Weg, um eine Sammlung-Objekt (List in Beispiel) in einer Schlüssel / Wert-Situation zu halten, wo der Schlüssel eine ID und der Wert ist eine Sammlung von einem Typ T?

Ist dies die einzige Option, oder gibt es eine bessere Lösung / eine andere Kollektion für diesen in .NET 3.5?

var x = new Dictionary<int, List<type>>();
War es hilfreich?

Lösung

Dies ist eine gute Lösung und wird ganz gut funktionieren -. Sie sind ein Wörterbuch Aufgabe {key = int, value = 4-Byte-Referenz} effektiv mit

Wenn Sie einen Wert durch den Schlüssel abruft Sie den Verweis auf die List<T> auf dem Heap zurück und in der Lage sein, es zu benutzen. Das wird eine sehr effiziente und kompakte Lösung für Ihr scheinbares Problem sein.

Andere Tipps

Ich habe keine Ahnung, ob das ist, was Sie brauchen, aber ich werde hacken auf ihn haben.

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

, die Sie dann rufen

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

Ich bin mir nicht sicher, ob dies wird Ihnen helfen oder nicht, aber es kann Ihnen helfen, Ihre Frage umformulieren.

. HINWEIS: Die obige Luft-Code ist und ist nicht getestet

Ich glaube nicht, dass irgendetwas im Rahmen, aber ich denke, es gibt eine Multidictionary Sammlung in der PowerCollections Bibliothek ist. Sie könnten versuchen, dass.

Ich glaube, Sie wahrscheinlich Ihre Wrapper-Klasse nach Ihren Bedürfnissen schreiben soll. Ich meine, wenn Sie einen Wörterbuch von vorgefertigten Listen speichern müssen, Dictionary<int, List<type>> sollte so lange in Ordnung sein, wie es nur ein Privateigentum. Sie sollten es nicht aussetzen, obwohl öffentlich als es offensichtlich zu viele Informationen aussetzt und man kann es nicht, weil der Mangel an Kovarianz ähnlich wie IDictionary<int, IList<T>> oder etwas werfen.

Ihre beste Wette so etwas wie das wäre:

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;
       }
    }
}

Offensichtlich Ihre Bedürfnisse unterschiedlich sein können, müssen Sie möglicherweise ein paar Schnittstellen implementieren, usw., aber dies ist die allgemeine Idee.

Wenn Sie Ihre ID ein Mitglied Ihrer Art ist, könnten Sie erwägen, einen System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

Sie suchen ein mehrwertiges Wörterbuch, das heißt eine Schlüssel Sammlung, wobei jeder Schlüssel mehrere Werte haben kann? PowerCollections hat eine solche Multidictionary.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top