Domanda

Qual è il modo migliore per mantenere un oggetto collection (Elenco in esempio) in una situazione chiave / valore, in cui la chiave è un ID e il valore è una raccolta di un tipo T?

È questa l'unica opzione o esiste una soluzione migliore / un'altra raccolta per questo in .NET 3.5?

var x = new Dictionary<int, List<type>>();
È stato utile?

Soluzione

Questa è una buona soluzione e funzionerà abbastanza bene - stai effettivamente usando un oggetto dizionario di {chiave = int, valore = riferimento a 4 byte}.

Quando recuperi un valore con la chiave, otterrai il riferimento all'elenco < T > sull'heap e sarai in grado di usarlo. Questa sarà una soluzione molto efficace e compatta al tuo apparente problema.

Altri suggerimenti

Non ho idea se questo è ciò di cui hai bisogno, ma dovrò tagliarlo.

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

che puoi quindi chiamare

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

Non sono sicuro se questo ti aiuterà o no, ma potrebbe aiutarti a riformulare la tua domanda.

NOTA: quanto sopra è un codice aereo ed è non testato.

Non penso che ci sia qualcosa all'interno del framework, ma penso che ci sia una raccolta MultiDictionary nella libreria di PowerCollections. Potresti provarlo.

Penso che dovresti probabilmente scrivere la tua classe wrapper in base alle tue esigenze. Voglio dire, se devi archiviare un dizionario di elenchi predefiniti, Dizionario < int, Elenco < tipo > > dovrebbe andare bene purché sia ??solo una proprietà privata. Non dovresti esporlo pubblicamente, poiché ovviamente espone troppe informazioni e non puoi trasmetterlo a IDictionary < int, IList < T > > o qualcosa di simile a causa della mancanza di covarianza.

La tua scommessa migliore sarebbe qualcosa del genere:

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

Ovviamente, le tue esigenze potrebbero essere diverse, potresti dover implementare un paio di interfacce, ecc., ma questa è l'idea generale.

Se il tuo ID è un membro del tuo tipo, potresti prendere in considerazione l'implementazione di un System.Collections.ObjectModel.KeyedCollection < TKey, TItem >

Stai cercando un dizionario multivalore, ovvero una raccolta con chiave, in cui ogni chiave può avere più valori? PowerCollections ha un tale MultiDictionary.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top