2016-08-29 22 views
0

複数の辞書の値を正確に3つのリストにマージしたい。私の現在の解決策は、linqを使って辞書を最初に結合し、その値をリストに変換します。複数の辞書の値を1つのリストにマージする

private List<Part> AllParts() 
{ 
    return walls.Concat(floors) 
       .Concat(columns) 
       .ToDictionary(kvp => kvp.Key, kvp => kvp.Value) 
       .Values 
       .ToList(); 
} 

リストを最初にマージするのは冗長なようです。これをどのように改善できますか?

+0

このソリューションを試すhttp:// stackoverflow。com/questions/10559367/combine-multiple-dictionaries-a-single-dictionary –

答えて

1

あなたは辞書に変換することなく、あなたの辞書を連結し、値を選択することで、このコードを簡素化することができます。

return walls.Concat(floors) 
      .Concat(columns) 
      .Select(kvp => kvp.Value) 
      .ToList(); 

それが最短と最も読みやすいソリューションのように見えます。

return walls.Values 
      .Concat(floors.Values) 
      .Concat(columns.Values) 
      .ToList(); 

ただし、ここでは可読性、保守性またはパフォーマンスの改善は見られません。

P.S.私はあなたの辞書に重複がないと仮定しました。このコードには重複した値が含まれ、ToDictionaryアプローチでは重複の例外がスローされます。

1

まず第一に、いくつかの有用なリンク:基本的に

Combine multiple dictionaries into a single dictionary

Combine multiple dictionaries with same key in them into one dictionary with the sum of values

Merging dictionaries in C#

、最初の辞書をマージすることは必須ですが、回避するために、あなたよりも効率的な方法があります重複するもの:

辞書の任意の数のオプション1

var dictionaries = new[] { walls, floors, columns }; 
var result = dictionaries 
    .SelectMany(d => d) 
    .GroupBy(
    kvp => kvp.Key, 
    (key, kvps) => new { Key = key, Value = kvps.Sum(kvp => kvp.Value) } 
) 
    .ToDictionary(x => x.Key, x => x.Value).ToList(); 
return result; 

作品、重複を避けるために2

var result = walls.Union(floors).Union(columns) 
      .ToDictionary (k => k.Key, v => v.Value).ToList(); 
return result; 

だけではなく、3

オプション:

var result = walls.Concat(floors).Concat(columns).GroupBy(d => d.Key) 
      .ToDictionary (d => d.Key, d => d.First().Value).ToList(); 
+0

これは本当に質問に答えるものではありません。また、言及された他のものと同様に、重複するキーを考慮に入れずに辞書の値だけをマージする方法があります。 – JayByte

1

Dictionaryが公開にと呼ばれるプロパティは、基本的に、そのディクショナリ内のすべての値の読み取り専用コレクションです。これは、キーを気にしないとき、すべての値を取得する最も簡単な方法であり、それはそれらを結合する最も簡単な方法です:

var allParts = walls.Values 
       .Concat(floors.Values) 
       .Concat(columns.Values); 

これは、様々な方法よりも、はるかに簡単、そしておそらくよりパフォーマンスですLINQクエリを使用してKeyValuePairsをPartsに変換するなど、ここではDictionarityは気にしません。値のリストのみを扱うため、値のリストとして扱います。

しかし、あるものは、存在する場合にはPartが重複していないことです。 Concat()の代わりにUnion()を使用してこれを行うことができます。

関連する問題