4

我正在尝试遍历包含对象作为值的字典:

foreach (KeyValuePair<int, CMapPool_Entry> Entry in MapPool)
{
   this.SendConsoleMessage(Entry.Value.Map);
}

下面你可以看到 CMapPool_Entry 的类

public class CMapPool_Entry
{
    public string Map;
    public string Mode;
    public int Rounds;
    public int Index;
    public int Votes;

    public bool Nominated;
    public string Nominator;

    public CMapPool_Entry(string map, string mode, int rounds, int index, string Nominator_LeaveEmptyStringIfNone)
    {
        this.Map = map;
        this.Mode = mode;
        this.Rounds = rounds;
        this.Index = index;

        // If Nominator isn't empty, set map to nominated
        if (Nominator_LeaveEmptyStringIfNone != "")
        {
            this.Nominated = true;
            this.Nominator = Nominator_LeaveEmptyStringIfNone;
        }
    }

    public void AddVote()
    {
        this.Votes++;
    }

    public void RemoveVote()
    {
        if (this.Votes > 0)
            this.Votes--;
    }
}

这里还可以看到 SendConsoleMessage 方法:

    private void SendConsoleMessage(string message)
    {
        this.ExecuteCommand("procon.protected.pluginconsole.write", String.Format("{0}", message));
    }

对我来说它看起来会起作用,我已经阅读了如何从 foreach 中的字典中编辑值会产生以下错误:“集合已修改;枚举操作可能无法执行。”

但是为什么我会收到这个错误?我没有编辑任何值,我只是在阅读它们,对吗?如果 CObject 是 string 或 int ,它可以正常工作,但如果它是一个对象,它就会发疯。我做错了什么,我该怎么办?


编辑:经过进一步调试后,我注意到 Entry.Key 可以很好地使用,但是一旦我触摸 Entry.Value,我就会收到错误消息。由于某种原因,我随机收到了两个不同的错误:

  1. “集合已修改;枚举操作可能无法执行。”
  2. “给定的键不在字典中。”

有任何想法吗?或者以对象为值的枚举字典根本不起作用?

4

2 回答 2

4

正如每个人在评论中指出的那样,当您尝试从中读取字典时,您正在修改另一个线程中的字典。您在评论中写道,您通过以下方式“复制”字典:

Dictionary<int, CMapPool_Entry> MapPool = this.Votemap_MapPool;

这不会复制字典,而是创建对Votemap_MapPoolin的引用MapPool,因此在修改Votemap_MapPool代码中的某处时,在阅读时MapPool您将收到异常System.InvalidOperationException,并显示 Collection 已修改的消息。

要真正复制您的字典,您必须编写:

Dictionary<int, CMapPool_Entry> MapPool = new Dictionary<int, CMapPool_Entry>(Votemap_MapPool);

这确实创建了一个带有Votemap_MapPoolas 内容的 Dictionary 的新实例,并且在Votemap_MapPool被修改时MapPool保持不变。

于 2012-07-14T12:25:00.070 回答
0

在处理 foreach 期间,您无法更改集合(字典也是集合)。

解决方法:

using System.Linq;

foreach (CObject value in ExampleDictionary.Values.ToArray()) {
   this.SendConsoleMessage(value.SomeVariableInObject);
}
于 2012-07-14T11:15:17.600 回答