2012-10-09 21 views
5

私はList<string> AllowedListDictionary<string,List<string>> MyDictionaryを持っています。削除するキーのリストを指定して、キー、値のペアを辞書から削除する

辞書の各キーについて、それがAllowedListにあるかどうかをチェックしたい場合は、キーと値を辞書から削除したいと思います。

私は直感的に、私が欲しいものであるように思われ、これを試してみました:

foreach (string key in MyDictionary.Keys) 
{ 
    if (!AllowedList.Contains(key)) MyDictionary.Remove(key); 
} 

しかし、私はInvalidOperationExceptionに遭遇しました:

コレクションが変更されました。列挙操作が実行されないことがあります。

私はこれの周りに単純な方法があると確信していますが、すぐにはわかりません。

答えて

9

あなたが辞書にないキーを見つけるためにEnumerable.Exceptを使用することができます。

foreach (var key in MyDictionary.Keys.Except(AllowedList).ToList()) 
    MyDictionary.Remove(key); 

ToList()は、セットの新しいリストを作成例外を防止します。

+1

+1と私は最初の行を 'var keys = MyDictionary.Keys;'に簡略化できると思います。 – farfareast

+2

Seismoidの解法も有効です。私は、このlinqセット差の提案を最も楽しんでいます。 – user17753

1

削除したいキーを一時的なリストに格納しておき、それ以降の追加のfor-loopですべての削除を実行できます。

List<TKey> templist = new List<TKey>(); 

foreach (var x in MyDictionary) 
{ 
    if (!AllowedList.Contains(x.Key)) 
     templist .Add(x.Key); 
} 
foreach (TKey item in templist) 
{ 
    MyDictionary.Remove(item); 
} 

これも役に立つことができます How to delete entries from a dictionary using the value

関連する問題