dict1 と dict2 の 2 つの辞書があり、そのキーを使用して dict2 にある項目を dict1 から削除したいと考えています。dict2 をループして「ContainsKey」メソッドを使用する代わりに、linq を使用するような他のアプローチがあります。
3 に答える
これを行う適切な方法は次のとおりです。
foreach(var key in dic2.Keys)
{
dic1.Remove(key);
}
LINQ は Language Integrated Queryの略です。データに対してクエリを実行するためのものです。クエリは、基になる構造を変更しません。あなたがしたいことは、クエリの 1 つを変更することなので、LINQ は適切なツールではありません。
Remove
また、実際にキーを削除したかどうかを示すブール値を返すことにも注意してください。例外はスローしません。removeを呼び出す前に呼び出す必要はありませんContainsKey
(これにより、アイテムごとに追加のテーブル ルックアップを節約できます)。
Linq もループを使用しています。Linq は、削除したいものを見つけるのに役立ちます。
foreach (var kv in dict2.Where(kv => dict1.ContainsKey(kv.Key)))
dict1.Remove(kv.Key);
これは、1秒ContainsKey
ごとに O(1) 操作を使用するため、効率的です。KeyValuePair
Dictionary
http://msdn.microsoft.com/en-us/library/kabs04ac.aspx
編集:もちろんDictionary.Remove
、指定されたキーが存在しなくても使用できるため、Servyのアプローチは一般的に優れています。
他の人が述べたように、linq がこの仕事に適したツールであるかどうかは議論の余地があります。ただし、linq でなければならない場合は、これが適切な解決策だと思います。
var dict1 = new Dictionary<int,double>();
var dict2 = new Dictionary<int,double>();
dict1 = dict1.Where(kv => !dict2.ContainsKey(kv.Key))
.ToDictionary(kv => kv.Key, kv=>kv.Value);
これは、既存のディクショナリからキーを削除するのではなく、必要なキーのみを含む新しいディクショナリを生成します。
ほとんどのキーを削除する必要がある場合、これは実際には高速になる可能性があります。
ps