2

dict1 と dict2 の 2 つの辞書があり、そのキーを使用して dict2 にある項目を dict1 から削除したいと考えています。dict2 をループして「ContainsKey」メソッドを使用する代わりに、linq を使用するような他のアプローチがあります。

4

3 に答える 3

9

これを行う適切な方法は次のとおりです。

foreach(var key in dic2.Keys)
{
    dic1.Remove(key);
}

LINQ は Language Integrated Queryの略です。データに対してクエリを実行するためのものです。クエリは、基になる構造を変更しません。あなたがしたいことは、クエリの 1 つを変更することなので、LINQ は適切なツールではありません。

Removeまた、実際にキーを削除したかどうかを示すブール値を返すことにも注意してください。例外はスローしません。removeを呼び出す前に呼び出す必要はありませんContainsKey(これにより、アイテムごとに追加のテーブル ルックアップを節約できます)。

于 2012-09-07T14:47:15.727 に答える
1

Linq もループを使用しています。Linq は、削除したいものを見つけるのに役立ちます。

foreach (var kv in dict2.Where(kv => dict1.ContainsKey(kv.Key))) 
    dict1.Remove(kv.Key);

これは、1秒ContainsKeyごとに O(1) 操作を使用するため、効率的です。KeyValuePairDictionary

http://msdn.microsoft.com/en-us/library/kabs04ac.aspx

編集:もちろんDictionary.Remove、指定されたキーが存在しなくても使用できるため、Servyのアプローチは一般的に優れています。

于 2012-09-07T14:46:53.887 に答える
-2

他の人が述べたように、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 ここに画像の説明を入力

于 2012-09-07T15:02:17.153 に答える