1. ホーム
  2. c#

[解決済み】C#で辞書をマージする

2022-03-23 07:41:59

質問

2つ以上の辞書をマージするのに最適な方法は何ですか? Dictionary<T1,T2> )をC#で作成することはできますか? (LINQのような3.0の機能で結構です)。

という流れでメソッドシグネチャを考えています。

public static Dictionary<TKey,TValue>
                 Merge<TKey,TValue>(Dictionary<TKey,TValue>[] dictionaries);

または

public static Dictionary<TKey,TValue>
                 Merge<TKey,TValue>(IEnumerable<Dictionary<TKey,TValue>> dictionaries);

EDITです。 JaredParとJon Skeetからクールな解決策を得ましたが、私は重複したキーを処理するものを考えていました。衝突した場合、一貫している限り、どの値がdictに保存されるかは問題ではありません。

どのように解決するのですか?

これは、重複が発生した場合にどうしたいかによります。たとえば、次のようなことができます。

var result = dictionaries.SelectMany(dict => dict)
                         .ToDictionary(pair => pair.Key, pair => pair.Value);

重複するキーを取得した場合は例外が発生します。

EDIT: ToLookupを使用すると、キーごとに複数の値を持つことができるルックアップを得ることができます。あなたは できる で、それを辞書に変換する。

var result = dictionaries.SelectMany(dict => dict)
                         .ToLookup(pair => pair.Key, pair => pair.Value)
                         .ToDictionary(group => group.Key, group => group.First());

ちょっと醜いし、効率も悪いですが、コードの面では一番手っ取り早い方法だと思います。(確かに私はテストしていませんが)。

もちろん、自分でToDictionary2拡張メソッドを書くこともできます(もっといい名前ですが、今はそれを考える時間がありません)。重複するキーを上書き(または無視)するだけで、それほど難しいことではありません。重要なのは、(私の考えでは) SelectMany そして、辞書はそのキーと値のペアの反復処理をサポートしていることを理解する。