2016-09-20 17 views
0

リストから辞書を作成します。私は、ルールに従うtempListから辞書を作成する必要がC#のように、私は、辞書のリストを持っている<Dictionary>

dic1.Add("A_key1","A_val11"); dic1.Add("B_key1","B_val11") 
dic1.Add("C","C"); dic1.Add("D","D"); 

dic2.Add("A_key1","A_val21"); dic1.Add("B_key1","B_val21"); 
dic2.Add("C","C"); dic1.Add("D","D"); 
dic2.Add("A_key2","A_val22"); dic1.Add("B_key2","B_val22"); 
dic2.Add("A_key3","A_val23"); dic1.Add("B_key3","B_val23"); 

List<Dictionary<string,string>> tempList = new List<Dictionary<string,string>>{dic1, dic2}; 

:、キー=「A_key *」値をヴァル=「B_key *リスト内のすべての元の辞書の値。 例えば、上記の例では:

expectDic = {("A_val11","B_val11"), 
       ("A_val21","A_val21"), 
       ("A_val22","A_val22"), 
       ("A_val23","A_val23")} 

私はLINQのとそれを解決することはできますか?

+1

'SelectMany'と' ToDictionary'の組み合わせがこのトリックを行うかもしれません –

+0

2つの辞書しか存在しませんか?両方のディクショナリに一致するキーがないアイテムはどうでしょうか? – sachin

+0

'dic2'とは何ですか? – Maarten

答えて

0

ご質問が不明なので、私はいくつかの前提を立てます。これらの仮定が間違っている場合は、私に知らせて、適切に修正してください。

キーが同じであるため、テストデータをオフにすると、辞書をマージすることができなくなります。

最後に、テストデータ自体が例外をスローするため、正しくありません。

 Dictionary<string, string> dic1 = new Dictionary<string, string>(); 
     Dictionary<string, string> dic2 = new Dictionary<string, string>(); 

     dic1.Add("A_1", "A_val11"); 
     dic1.Add("B_1", "B_val11"); 
     dic1.Add("C", "C"); 
     dic1.Add("D", "D"); 


     dic2.Add("A_1", "A_val21"); 
     dic2.Add("A_2", "A_val22"); 
     dic2.Add("A_3", "A_val23"); 
     dic2.Add("B_1", "B_val21"); 
     dic2.Add("B_2", "B_val22"); 
     dic2.Add("B_3", "B_val23"); 
     dic2.Add("C", "C"); 
     dic2.Add("D", "D"); 


     List<Dictionary<string, string>> tempList = new List<Dictionary<string, string>> { dic1, dic2 }; 

ここで挙げた例のために動作しますいくつかのコードです:

Dictionary<string, string> expectDic = new Dictionary<string, string>(); 
     for (int i = 0; i < tempList.Count; i++) 
     { 
      Dictionary<string, string> onedic = tempList[i]; 
      while (onedic.Values.ToList().Where(x => x.Contains("A_")).FirstOrDefault() != null) 
      { 
       expectDic.Add(onedic.Select(x => x.Value).Where(x => x.Contains("A_") && !expectDic.Keys.Contains(x)).First(), onedic.Select(x => x.Value).Where(x => x.Contains("B_") && !expectDic.Values.Contains(x)).First()); 
       onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("A_")).FirstOrDefault()); 
       onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("B_")).FirstOrDefault()); 
      } 
     } 

しかし、何を求めていることは非常に複雑であるこのように、私は、テストデータは、次のされたことを前提に作られました私はLINQの例外処理をお勧めします。

関連する問題