1

のメソッドを次のように連結することにより、2つ以上のIDictionary<TKey, TValue>オブジェクトを1つにマージするヘルパーがあります。IDictionary<TKey, string>TValueToString()

public class DictionaryHelper<TKey, TValue>
{
    public static IDictionary<TKey, string> MergeDictionaries<TKey, TValue>(params IDictionary<TKey, TValue>[] dictionaries) where TValue : class
    {
        var returnValue = new Dictionary<TKey, string>();
        foreach (var dictionary in dictionaries)
        {
            foreach (var kvp in dictionary)
            {
                if (returnValue.ContainsKey(kvp.Key))
                {
                    returnValue[kvp.Key] += kvp.Value.ToString();
                }
                else
                {
                    returnValue[kvp.Key] = kvp.Value.ToString();
                }
            }
        }
        return returnValue;
    }

}

これは簡単で読みやすいですが、これを行うにはもっと効率的な方法があるはずです。ある?

4

3 に答える 3

7

これがより効率的かどうかはわかりませんが、少なくともはるかに短いです:

var result = dictionaries.SelectMany(d => d)
                         .ToLookup(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(g => g.Key, g => string.Concat(g));
于 2012-05-01T14:07:33.980 に答える
1

次の方法で可視 foreachを削除できSelectManyます。

foreach (var kvp in dictionaries.SelectMany(dd => dd))
{
    if (returnValue.ContainsKey(kvp.Key))
    {
        returnValue[kvp.Key] += kvp.Value.ToString();
    }
    else
    {
        returnValue[kvp.Key] = kvp.Value.ToString();
    }
}

dtb の方がエレガントで効率的ですが、これをさらに拡張することもできます。

var merged = dictionaries.SelectMany(dd => dd)
                         .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(
                             gg => gg.Key,
                             gg => String.Concat(gg));

ただし、これは現在のアプローチよりも効率的または読みやすいとは言えません。

于 2012-05-01T14:06:11.543 に答える
0

TryGetValueを使用して、ソース値の場所と取得を統合できます。

于 2012-05-01T14:01:11.967 に答える