5

私はList<string> AllowedListとを持っていDictionary<string,List<string>> MyDictionaryます。

ディクショナリの各キーについて、それが上にあるかどうかを確認したいAllowedList、そうでない場合はキーと値をディクショナリから削除したい。

私は直感的にこれを試しましたが、これは私が望んでいたようです:

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

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

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

おそらくこれを回避する簡単な方法があると確信していますが、すぐにはわかりません。

4

2 に答える 2

9

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

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

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

于 2012-10-09T19:47:00.530 に答える
1

削除するキーを一時リストに保存し、その後すべての削除を追加の for ループで行うことができます/すべきです。

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);
}

これも役に立ちます: 値を使用して辞書からエントリを削除する方法

于 2012-10-09T19:41:53.957 に答える