web-dev-qa-db-ja.com

辞書の値を一般的なリストとして取得する方法

辞書の値からリストを取得したいのですが、見た目ほど簡単ではありません!

ここにコード:

Dictionary<string, List<MyType>> myDico = GetDictionary();
List<MyType> items = ???

私が試します:

List<MyType> items = new List<MyType>(myDico.values)

しかし、それは動作しません:-(

52
Florian

もちろん、myDico.ValuesはList<List<MyType>>です。

リストをフラット化する場合は、Linqを使用します

var items = myDico.SelectMany (d => d.Value).ToList();
49
VdesmedT

どうですか:

var values = myDico.Values.ToList();
83
Slicedbread

別のバリアント:

    List<MyType> items = new List<MyType>();
    items.AddRange(myDico.values);
25
shoma13

おそらく、Valuesのすべてのリストを単一のリストにフラット化する必要があります。

List<MyType> allItems = myDico.Values.SelectMany(c => c).ToList();
25
SLaks

私のOneLiner:

var MyList = new List<MyType>(MyDico.Values);
8
Mathias Vetsch

Slaksの答えをさらに進めると、辞書の1つ以上のリストがnullの場合、ToList()を呼び出すときにSystem.NullReferenceExceptionがスローされ、安全にプレイできます。

List<MyType> allItems = myDico.Values.Where(x => x != null).SelectMany(x => x).ToList();
1
Stacked
Dictionary<string, MyType> myDico = GetDictionary();

var items = myDico.Select(d=> d.Value).ToList();
0
CharithJ

これを使って:

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);
0
Daniel Hilgarth

使用できる別のバリ​​エーション

MyType[] Temp = new MyType[myDico.Count];
myDico.Values.CopyTo(Temp, 0);
List<MyType> items = Temp.ToList();
0
johnny 5
        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);
0
sathis