0

私のハッシュテーブルには、重複する値とキーがないことを確信しています。これが私のコードです:

     private void checkclientleave(string content)
    {
        if (content == "I am leaving the room")
        {
            foreach (DictionaryEntry dict in clientsInroom)
            {
                 if (dict.Value == clientSocket)
                    clientsList.Remove(dict.Key);
            }
   }
   }

私のハッシュテーブルの値は、各クライアントのソケットです。私のハッシュテーブルの鍵は、各クライアントの名前です。不明なエラーが発生しました:コレクションが変更されました列挙操作が実行されない可能性があります

4

3 に答える 3

2

不明なエラーが発生しました:コレクションが変更されました列挙操作が実行されない可能性があります

これは不明なエラーではありません-十分に文書化されたエラーです:

コレクションが変更されない限り、列挙子は有効なままです。要素の追加、変更、削除など、コレクションに変更が加えられた場合、列挙子は回復不能に無効になり、その動作は未定義になります。

そしてのためにMoveNext

InvalidOperationException[スローされた場合]列挙子が作成された後にコレクションが変更されました。

辞書を反復処理しているため、反復処理中にエントリを追加または削除することはできません。他の値がないことがわかっている場合は、指定された値に一致するキーが見つかったらすぐにメソッドから戻ることができます。

if (dict.Value == clientSocket)
{
    clientsList.Remove(dict.Key);
    return;
}

もう1つの方法は、LINQを使用することです。

var key = clientsInRoom.Where(pair => pair.Value == clientSocket)
                       .Select(pair => pair.Key)
                       .FirstOrDefault();
if (key != null)
{
    clientsInRoom.Remove(key);
}
于 2012-04-04T18:21:05.293 に答える
0

それは私には間違っているように見えます-私は

               clientsList.Remove(dict.Key);

実際にする必要があります

               clientsInRoom.Remove(dict.Key);

同じディクショナリ内のディクショナリを変更する場合はforeach、例外が発生します。

于 2012-04-04T18:23:41.563 に答える
0

反復中のアイテムの削除は可能です。別の方法でアプローチする必要があります。「for」ループを使用して、逆方向に繰り返す必要があります。

これはあなたの特定の状況ではおそらく必要ないことは知っていますが、後でこの質問を見つけた他の誰かに役立つかもしれないと思いました。

より詳細な答えを彼女に探してください: それを反復しながら一般的なリストから要素を削除する方法は?

于 2012-04-04T18:48:30.193 に答える