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[throw if] 在创建枚举器后修改了集合。

您正在迭代字典,并且在迭代时无法添加或删除条目。如果您知道您不会有任何其他值,则可以在找到与给定值匹配的键后立即从您的方法中返回:

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

另一种选择是使用 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 回答