0

次の条件に基づいて、辞書内の指定されたキーを削除するにはどうすればよいですか?

foreach (var kvp in dict)
            {
                if (kvp.Key.Contains('/'))
                {
                    //delete the key
                }
            }
4

6 に答える 6

9

あなたはこのようにそれをするでしょう:

foreach(var keyToDelete in dict.Keys.Where(x => x.Contains('/')).ToList())
    dict.Remove(keyToDelete);

ここで重要なのは、ToList()後への呼び出しWhereです。これにより、削除する必要のあるすべてのキーが、反復可能な新しいリストに追加されます。
あなたがなしでこのコードを試すならば、あなたは:ToList()を得るでしょう。InvalidOperationException

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

このコードは、現在受け入れられている回答よりも効率的であることに注意してください。完全な辞書ではなく、削除する必要のあるキーのみをコピーします。

于 2013-02-13T07:54:08.400 に答える
3

問題は、その要素をループしている間はコレクションを変更できないという事実です。解決策は、削除するキーを別のコレクションに配置し、これをループして要素を削除することです。これはダニエルの答えがすることです。

LINQを使用できない/使用したくない場合は、次の方法で使用できます。

List<YourKeyType> toRemove = new List<YourKeyType>();
foreach (var kvp in dict)
{
    if (kvp.Key.Contains('/'))
        toRemove.Add(kvp.Key);
}
foreach (var aKey in toRemove)
    dict.Remove(aKey);
于 2013-02-13T08:27:16.060 に答える
2

データセットによっては、破棄するキーなしで新しいオブジェクトを作成する方が効率的な場合があります。

dict = dict.Where(kvp => !kvp.Key.Contains('/'))
           .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

また、コードの意図をより明確に伝えるため、キーを削除するよりもこれが好ましいと主張することもできますが、これは私の個人的なコーディングスタイルと密接に関連しているため、マイレージは異なる場合があります。

于 2013-02-13T08:20:20.047 に答える
2

これはすでに回答済みとしてマークされていることはわかっていますが、最大サイズが指定されていない辞書から1つのキーだけを削除したい場合は、1つのキーを削除するためだけに辞書全体のコピーを作成するのは良い解決策ではないと思います!!

一致するキーのエントリを1つだけ削除するには、次のようにします。

foreach (var kvp in dict)
{
    if (kvp.Key.Contains('/'))
    {
        dict.Remove(kvp.Key);
        break;
    }
}

辞書全体のコピーは必要ありません!

これは、削除するキーが1つだけであることを前提としていることに注意してください。それ以上ある場合は、上記のダニエルまたはフランチェスコの回答を使用してください。

(実際には、Danielの回答を使用することをお勧めしますが、Linqを使用せずに、これを例としてここに残しておきます。)

于 2013-02-13T08:37:50.067 に答える
1

編集:以下の他の回答で述べられているように、以下のコードで重要なのはToList()の呼び出しです。これにより、dictのコピーが作成され、反復するコレクションを変更せずに、dictからアイテムを削除しながら反復することができます。

あなたは次のようなものを使用してこれを行うことができます

    dict.ToList().ForEach(a => { if (a.Key.Contains('/') dict.Remove(a.Key); });
于 2013-02-13T07:58:45.900 に答える
-2

Foreachはおそらく例外をスローします。代わりにforを使用してみてください。

削除するには、Removeメソッドを使用します。

于 2013-02-13T07:54:34.237 に答える