-3

2 つの辞書があるとします。

Dictionary<string, string> orig = new Dictionary <string, string>();
orig.Add("one", "value one");
orig.Add("two", "");
orig.Add("three", "");

Dictionary<string, string> newDict = new Dictionary <string, string>();
newDict.Add("one", "this value should not be added");
newDict.Add("two", "value two");
newDict.Add("three", "value three");

結果の辞書が対応する値が空の場合にのみキーを更新するように、2 つの辞書をマージするにはどうすればよいですか? さらに、マージでは、 に存在するが に存在しないキーを追加しnewないでorigください。つまり、"one" の値は "value one" のままですが、"two" と "three" は の値で更新されますnew

を使用してorig.Concat(new);みましたが、元の辞書が残ります。おそらくこれはLINQで行うことができますか?

4

4 に答える 4

2

このループは、効率的で読みやすいものを実行します。

Dictionary<string, string> result = new Dictionary<string, string>();
foreach (var keyVal in orig)
{
    if (!string.IsNullOrEmpty(keyVal.Value))
        result.Add(keyVal.Key, keyVal.Value);
    else
    {
        string val2;
        if (newDict.TryGetValue(keyVal.Key, out val2))
            result.Add(keyVal.Key, val2);
        else
            result.Add(keyVal.Key, "");
    }
}

結果:

one, value one  
two, value two
three, value three
于 2013-10-09T15:06:05.470 に答える
1

私はforeach

foreach (var pair in orig.Where(x=> string.IsNullOrEmpty(x.Value)).ToArray())
{
    orig[pair.Key] = newone[pair.Key];
}
于 2013-10-09T15:04:27.073 に答える
1

拡張メソッド「ワンライナー」は、意図を明確にするのに役立つ場合に優れていますが、このようなものについては、目的の操作を実行する明示的なループを備えた小さなメソッドを作成する傾向があります。これは、さまざまな拡張メソッド変換を使用して新しい辞書を作成するよりもはるかにクリーンだと思います。

    public void PopulateMissingValues(Dictionary<string, string> orig, Dictionary<string, string> newDict)
    {
        foreach (var pair in orig.Where(p => p.Value == string.Empty))
        {
            string newValue;
            if (newDict.TryGetValue(pair.Key, out newValue))
                orig[pair.Key] = newValue;
        }
    }
于 2013-10-09T15:05:46.753 に答える