2017-04-05 12 views
1

クラスBで記述されたキーと値のペアの配列を含むクラスAを持っています。そのキーの1つを「名前」といいます。私は最初の辞書のキーはB列と値に「名前」という属性はそうB.Linqを使用して配列から辞書を構築する

public class A 
{ 
    public int a; 
    public B[] b; 
} 

public class B 
{ 
    public string key; 
    public string value; 
} 

A[] a = new A[] 
{ 
    new A { a = 1, b = new B[] { new B { key = "name", value = "n1"}, new B { key = "test", value = "t1" } }, }, 
    new A { a = 2, b = new B[] { new B { key = "name", value = "n2"}, new B { key = "test", value = "t2" } }, }, 
};  

のキー/値のペアを含む第2の辞書ですDictionary<string, Dictionary<string, string>>を構築するためのLINQを使用したいです実際に私は、アレイ「A」にLINQのを使用して、以下の辞書を構築したいと思います:

Dictionary<string, Dictionary<string, string>> d = new Dictionary<string, Dictionary<string, string>>() 
{ 
    { "n1", new Dictionary<string, string>() { { "name", "n1" }, { "test", "t1" } } }, 
    { "n2", new Dictionary<string, string>() { { "name", "n2" }, { "test", "t2" } } }, 
}; 

答えて

2

それは次のようになります。

var dict = a.ToDictionary(
    x => x.b[0].value, 
    y => y.b.ToDictionary(z => z.key, z => z.value) 
); 

このLINQの表現の唯一の「楽しさ」の部分があることです

var dict = a.ToDictionary(
    x => x.b.First(y => y.key == "name").value, 
    y => y.b.ToDictionary(z => z.key, z => z.value) 
); 
+0

クール:私はzパラメータ(xyz)まで使用していた...それはそれは右

コメント用に改訂(私は常にパラメータxに名前を付ける)を取得するために私に3つのコンパイルを取りました!パラメータ「名前」は、配列内にランダムに配置されてもよい(必ずしも最初の要素である必要はない)。どのように私はこれに対処するために表現を変更することができますか? – user957479

+0

@ user957479更新されました – xanatos

+0

ありがとうございます、あなたが結果を見るといつもとても簡単に見えます;-) – user957479

関連する問題