foreach(var item in newInfo)
{
int value;
myDict.TryGetValue(item.Name, out value);
myDict[item.Name] = value + item.NewInfo;
}
- 通常あなたが戻り値を使用しますが、明らかに。
余談
それはあなたが本当にそれが動作GetValueOrDefault
操作をやっているだけであるためです。
foreach(var item in newInfo)
{
myDict[item.Name] = myDict.GetValueOrDefault(item.Name) + item.NewInfo;
}
(あなたが潜在的に、より明確にするためGetValueOrDefault(item.Name, 0)
を呼び出すことができます。とは簡潔なあなたのコードを明確にすることができ、その時点で
public static TValue GetValueOrDefault<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key)
{
TValue value;
dictionary.TryGetValue(key, out value);
return value;
}
public static TValue GetValueOrDefault<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key,
TValue customDefault)
{
TValue value;
if (dictionary.TryGetValue(key, out value))
{
return value;
}
else
{
return customDefault;
}
}
:実際には、それが有効な拡張メソッドのペアになります。)戻るポイントへ
...
あなたはまだ2つの検索をしていることに注意してください - 一つは値を取得するためのもので、もう一つは追加/置換するものです。 TValue
型の引数を何か変更可能にすることなく、それを避けることはできません。それは可能ですが、ひどくいいことではありません。
の3つの検索 - ContainsKey
の場合は1つ、値が置き換えられる場合は2つ(キーが見つかった場合)です。 (。item.Name
は一度だけ評価が、それは同じだそれ以外のことでしょう):それは私たちが+=
を展開することを確認する方が簡単です
myDict[item.Name] = myDict[item.Name] + item.NewInfo;
別余談
それは次のようになりますDictionary
の操作をして、古い値に基づいて新しい値を得るための関数に基づいて "検索と置き換え"を実行しました。(キーが見つからなかった場合やTValue
のデフォルト値)replacementFunction
は、現在の値を取る関数であるだろうとブールキーが実際に見つかったかどうかと言って、そして戻っ
bool Update(TKey key, Func<TValue, bool, TValue> replacementFunction)
新しい値次に、辞書はキーをルックアップし、置換関数を呼び出してその場で値を更新することができる。 (これは拡張メソッドとして実装できません)
これは機能的であるが、単にint型のデフォルト値は防御コーディング観点から0であるので、値が0のみであることに注意してください、これは簡潔さのために、読みやすさ(及び潜在的に保守性)を犠牲にします。私はあなたが持っているものに固執します。正直です。 –
私はもっと大きな警告を出します - それは確かに特別なケースです。 –
まだ各項目を2回ハッシュしていませんか?一旦TryGetValueに入ったら、もう一度 'myDict [item.Name]'と答えてください。 –