2012-11-25 2 views

答えて

15

これは、リストにある要素を含むように新しい辞書を構築するために簡単です:

List<string> keysToInclude = new List<string> {"A", "B", "C"}; 
var newDict = myDictionary 
    .Where(kvp=>keysToInclude.Contains(kvp.Key)) 
    .ToDictionary(kvp=>kvp.Key, kvp=>kvp.Value); 

それは、既存の辞書(例えばを変更することが重要な場合

var keysToRemove = myDictionary.Keys.Except(keysToInclude).ToList(); 

foreach (var key in keysToRemove) 
    myDictionary.Remove(key); 

ToList()呼び出しに注意してください。削除するキーのリストを具体化することが重要です。 keysToRemoveのマテリアライゼーションなしでコードを実行しようとすると、「コレクションが変更されました」というような例外が発生する可能性があります。

+0

両方の方法の長所と短所は何ですか? – guiomie

+0

@guiomie旧wayは新しい辞書を構築するので、古いものはそのまま残していますが、メモリー占有量が増えてしまいます。後で、既存の辞書をインプレースで変更します。要するに、あなたが本当に巨大な辞書で操作していない場合、賛否両論はありません - プログラムの状態はこれらの2つの方法で同等ではありません。 – J0HN

7
// For efficiency with large lists, for small ones use myList below instead. 
var mySet = new HashSet<string>(myList); 

// Create a new dictionary with just the keys in the set 
myDictionary = myDictionary 
       .Where(x => mySet.Contains(x.Key)) 
       .ToDictionary(x => x.Key, x => x.Value); 
+0

新しい辞書を作成すると効率が悪いと思われませんか? – Nick

+0

これは良い質問です。より効率的で、新しい辞書を作成したり、多数のアイテムを取り出したりすることができます。私はそれが関係する数に依存すると思う、それは厳しいそれを測定することは興味深いでしょう。 – Robert

+0

私が行ったスピードテストは、私のソリューションです。ディクショナリ内のすべての要素に対してmySetを繰り返し実行しないので、辞書の作成がより効率的であることが容易にわかります。http:// pastebin。com/iY1LHRM1 – SimpleVar

0

コード:

public static void RemoveAll<TKey, TValue>(this Dictionary<TKey, TValue> target, 
              List<TKey> keys) 
{ 
    var tmp = new Dictionary<TKey, TValue>(); 

    foreach (var key in keys) 
    { 
     TValue val; 
     if (target.TryGetValue(key, out val)) 
     { 
      tmp.Add(key, val); 
     } 
    } 

    target.Clear(); 

    foreach (var kvp in tmp) 
    { 
     target.Add(kvp.Key, kvp.Value); 
    } 
} 

例:

var d = new Dictionary<string, int> 
      { 
       {"A", 4}, 
       {"B", 44}, 
       {"bye", 56}, 
       {"C", 99}, 
       {"D", 46}, 
       {"6672", 0} 
      }; 

var l = new List<string> {"A", "C", "D"}; 

d.RemoveAll(l); 

foreach (var kvp in d) 
{ 
    Console.WriteLine(kvp.Key + ": " + kvp.Value); 
} 

出力:

A: 4 
C: 99 
D: 46 
2
dict.Keys.Except(list).ToList() 
    .ForEach(key => dict.Remove(key)); 
関連する問題