辞書の値からリストを取得したいのですが、見た目ほど簡単ではありません!
ここにコード:
Dictionary<string, List<MyType>> myDico = GetDictionary();
List<MyType> items = ???
私が試します:
List<MyType> items = new List<MyType>(myDico.values)
しかし、それは動作しません:-(
もちろん、myDico.ValuesはList<List<MyType>>
です。
リストをフラット化する場合は、Linqを使用します
var items = myDico.SelectMany (d => d.Value).ToList();
どうですか:
var values = myDico.Values.ToList();
別のバリアント:
List<MyType> items = new List<MyType>();
items.AddRange(myDico.values);
おそらく、Values
のすべてのリストを単一のリストにフラット化する必要があります。
List<MyType> allItems = myDico.Values.SelectMany(c => c).ToList();
私のOneLiner:
var MyList = new List<MyType>(MyDico.Values);
Slaksの答えをさらに進めると、辞書の1つ以上のリストがnullの場合、ToList()
を呼び出すときにSystem.NullReferenceException
がスローされ、安全にプレイできます。
List<MyType> allItems = myDico.Values.Where(x => x != null).SelectMany(x => x).ToList();
Dictionary<string, MyType> myDico = GetDictionary();
var items = myDico.Select(d=> d.Value).ToList();
これを使って:
List<MyType> items = new List<MyType>()
foreach(var value in myDico.Values)
items.AddRange(value);
問題は、辞書のすべてのキーが値としてインスタンスのリストを持っていることです。次の例のように、各キーに値としてインスタンスが1つだけ含まれている場合、コードは機能します。
Dictionary<string, MyType> myDico = GetDictionary();
List<MyType> items = new List<MyType>(myDico.Values);
使用できる別のバリエーション
MyType[] Temp = new MyType[myDico.Count];
myDico.Values.CopyTo(Temp, 0);
List<MyType> items = Temp.ToList();
List<String> objListColor = new List<String>() { "Red", "Blue", "Green", "Yellow" };
List<String> objListDirection = new List<String>() { "East", "West", "North", "South" };
Dictionary<String, List<String>> objDicRes = new Dictionary<String, List<String>>();
objDicRes.Add("Color", objListColor);
objDicRes.Add("Direction", objListDirection);