リストを使用する最良の方法< T>キー/値コレクションにありますか?
-
03-07-2019 - |
質問
キーがIDで値がT型のコレクションであるキー/値の状況でコレクションオブジェクト(例ではリスト)を保持する最良の方法は何ですか?
これが唯一のオプションですか、それとも.NET 3.5のより良いソリューション/別のコレクションがありますか?
var x = new Dictionary<int, List<type>>();
解決
これは良い解決策であり、非常にうまく機能します-{key = int、value = 4 byte reference}の辞書オブジェクトを効果的に使用しています。
キーで値を取得すると、ヒープ上の List&lt; T&gt;
への参照が返され、使用できるようになります。これは、明らかな問題に対する非常に効率的でコンパクトなソリューションになります。
他のヒント
これがあなたが必要とするものであるかどうかはわかりませんが、私はそれをチョップします。
public Dictionary<int,List<T>> myFunction<T>()
{
var returnvalue = new Dictionary<int,List<T>>();
//Do some stuff with the collection.
return returnvalue;
}
これを呼び出すことができます
public void Main()
{
var functionreturn = myFunction<String>();
}
これが役立つかどうかはわかりませんが、質問の書き直しに役立つ場合があります。
注:上記はエアコードであり、テストされていません。
フレームワーク内に何かはないと思いますが、PowerCollectionsライブラリにはMultiDictionaryコレクションがあると思います。試してみてください。
おそらく、ニーズに応じてラッパークラスを作成する必要があると思います。あらかじめ作成されたリストの辞書を保存する必要がある場合、プライベートプロパティのみである限り、 Dictionary&lt; int、List&lt; type&gt;&gt;
は問題ありません。明らかに多くの情報を公開し、 IDictionary&lt; int、IList&lt; T&gt;&gt;
または共分散がないために類似したものにキャストできないため、公開するべきではありません。
あなたの最善の策は次のようなものです:
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;
}
}
}
明らかに、ニーズは異なる場合があり、いくつかのインターフェイスを実装する必要がある場合などがありますが、これは一般的な考え方です。
IDが自分のタイプのメンバーである場合、の実装を検討できます。 System.Collections.ObjectModel.KeyedCollection&lt; TKey、TItem&gt;
複数の値を持つ辞書、つまり各キーが複数の値を持つことができるキー付きコレクションを探していますか? PowerCollections にはそのようなMultiDictionaryがあります。