C# 公共静态字典

3

我正在尝试创建一个公共可访问的词典,以便我的整个程序都可以访问。我按照以下方式在我的表单下创建了它:

public static Dictionary<string, int> categories = new Dictionary<string, int>
    {
    {"services", 0},
    {"files", 0},
    {"shortcuts", 0},
    {"registry", 0},
    {"browsers", 0}
    };

现在,在一个私有方法中,我有这段代码:
                foreach (KeyValuePair<string, int> reference in categories)
            {
                for (int i = 0; i < scanLines.Count; i++)
                {
                    if (scanLines[i].Contains(reference.Key))
                    {
                        start = i + 1;
                        break;
                    }
                }
                for (int i = start; i < scanLines.Count; i++)
                {
                    if (scanLines[i].Contains("*"))
                    {
                        stop = i - 1;
                        break;
                    }
                }
                // Write the result for the category by subtracting the difference between
                // the start and stop variables
                categories[reference.Key] = stop - start;

这基本上是将日志文件分成部分,以计算类别字典中声明的这些部分之间的行数。现在我的问题是代码行:

categories[reference.Key] = stop - start;

程序一直抛出"无效操作异常"错误。这里我做错了什么?

2个回答

5

foreach 循环中,你不能改变集合(包括 Dictionary)。但是,你可以通过创建副本集合来进行快速解决,如下所示:

foreach (KeyValuePair<string, int> reference in categories.ToList())

我尝试过这个方法,甚至也试了试使用.ToArray(),但是每个类别的结果都是一样的。我读取的示例日志在其中一个类别下有6个结果,而其他所有类别都应该为0,但它返回所有类别都是5。显然,我需要在for循环中解决这个问题,而不是使用foreach循环。只是我不能想出如何做到这一点。 - user2613018
@user2613018 原始问题是关于异常的。在使用.ToList.ToArray时,您是否会遇到异常? - Ulugbek Umirov
是的,你说得对,它确实解决了我遇到的异常问题,因为使用.ToList()方法后就没有出现过异常。谢谢。 - user2613018

-1
你尝试在foreach循环中更改csope-closed变量(categories)。这是不允许的操作。
简单来说,就好像您被允许更改可存储在内存之外的堆栈中的变量一样。
使用另一个变量,例如,进行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接