集合已修改;枚举操作可能无法执行

2023-12-06

我的 TabControl 中有多个 TabItem; tabItem1、tabItem2、tabItem3...这些是

CloseableTabItem。

如果我在 tabItem1 中添加一个节点并按下按钮为该节点创建子图模型,则

相同的节点应该出现在 tabItem2 中并带有一个按钮;以便

tabItem2-标题 = 节点名称并且节点名称 = tabItem1-标题。

如果我按下 tabitem 2 中节点的按钮,则 tabitem 1 应该获得焦点。如果我关闭

tabItem1 并按下相同的按钮 tabItem1 应该再次加载(这发生在

子图按钮_单击)。

您发现这段代码有问题吗?

  private void ChildNode_Click(object sender, RoutedEventArgs args)
  {
        System.Windows.Controls.Button button = (System.Windows.Controls.Button)sender;
        Node node = Part.FindAncestor<Node>(button);
        MyNodeData nodeData = node.Data as MyNodeData;
        foreach (TabItem item in tabControl.Items)
        {
            if (nodeData.Text == item.Header.ToString())
            {
                item.Focus();
            }
            else if (nodeData.Text != item.Header.ToString())
            {
                SubGraphButton_Click(sender, args);
            }
        }
 }
 private void SubGraphButton_Click(object sender, RoutedEventArgs args)
 {
        string activeDirectory = @"X:\SubGraph\";
        string[] files = Directory.GetFiles(activeDirectory);
        foreach (string fileName in files)
        {
            FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
            System.Windows.Controls.Button button = (System.Windows.Controls.Button)sender;
            Node node = Part.FindAncestor<Node>(button);
            MyNodeData nodeData = node.Data as MyNodeData;
            if (node != null)
            {
                if (nodeData.Text + ".epk" == fileName.Substring(12, fileName.Length - 12) && !tabControl.Items.Contains(tabItem1))
                {
                    tabControl.Items.Add(tabItem1);
                    tabItem1.Focus();
                    var model = new MyGraphLinksModel();
                    model.Modifiable = true;
                    model.HasUndoManager = true;
                    activateDiagram(myDiagram1);
                    activeDiagram.Model = model;
                    model.Name = fileName.Substring(12, fileName.Length - 12);
                    model.Name = model.Name.Substring(0, model.Name.Length - 4);
                    tabItem1.Header = model.Name;
                    activeDiagram.PartManager.UpdatesRouteDataPoints = false;
                    StreamReader reader = new StreamReader(file);
                    string contents = reader.ReadToEnd();
                    XElement root = XElement.Parse(contents);
                    activeDiagram.LayoutCompleted += LoadLinkRoutes;
                    model.Load<MyNodeData, MyLinkData>(root, "MyNodeData",   "MyLinkData");
                }
           }
  }

当您在修改过程中修改集合时,很可能会导致错误。错误的类型及其可能性往往会根据底层集合的实际情况而有所不同。修改一个List当迭代时,它很可能会给你带来很多由 1 引起的错误(或者如果你修改很多,则由 1 产生以上的偏差),并且可能会出现越界错误。修改一个LinkedList可能会导致空指针异常、无限循环、访问不存在的项目等,但可能性很小。

因为在一般情况下,出现问题的可能性相当高,这些问题的影响也相当高,而且很难诊断到底出了什么问题(以及出在哪里),C# 在尝试迭代时选择只抛出异常在迭代期间修改的集合。这样,您就不会遇到奇怪的、意想不到的问题,这些问题直到比其根本原因更远的某个时间才会显现出来。

有几种不同的策略可用于避免此问题:

  1. 迭代与您真正想要修改的集合不同的集合。在某些情况下,这可以简单地通过添加一个来完成ToList调用一个序列,以便将其移动到一个新集合;执行此操作时,正在迭代的集合与正在修改的集合是分开的,因此不会出现错误。

  2. 您可以避免修改内部的实际集合foreach环形。常见的例子是创建一个List或其他“要进行的更改”的集合,无论是itemsToAdd, itemsToRemove等等。然后您可以在循环后添加/删除/删除所有这些项目。 (如果您只修改集合大小的一小部分,这非常有效。)

  3. 某些类型的集合可以“迭代”,而无需实际使用传统的迭代器(意味着foreach环形)。例如,您可以迭代List使用常规的for相反,只需在添加或删除项目时修改(递增/递减)循环变量即可。如果正确完成,这往往是一个有效的选项,但很容易犯错误并出错,因此虽然其他选项(稍微)效率较低,但它们对于非性能密集型代码来说是非常好的选择,因为他们的简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集合已修改;枚举操作可能无法执行 的相关文章

随机推荐

  • 使用java的mongo驱动程序保存接口对象列表

    我有一个 POJO 其中包含以下列表Resources 这是接口ResourceType1 and ResourceType2 public class MyPojo private List
  • 如何获取数据框箱线图中异常值的索引?

    我有一个数据框 我想获取异常值索引的每一列 这是我的数据框的一部分 mediamarkt 48 1 7126 4012 3711 3237 3432 2671 2861 7065 3158 4023 4770 3861 13 4108 74
  • MessageBodyWriter 未找到 vogella 教程

    我正在尝试重新创建最优秀的 vogella 教程 用于使用 java JAX RS 和 Jersey 创建 REST 我正在使用带有 Java EE 视角的 eclipse Kepler tomcat 7 0 我已经创建了 Todo 类 带
  • Xcode 4.5 故事板崩溃

    很多时候 当我尝试在 Storyboard 中编辑 UILabels 时 Xcode 会崩溃 有什么想法可能导致这种情况吗 看起来它与自动布局约束之一有关 这是错误报告 Process Xcode 43938 Path Applicatio
  • 无法在 JSP 中包含 WEB-INF 目录中的 javascript 文件。

    如何使用tomcat在jsp中包含以下文件夹WEB INF includes header js中的文件 我已在 jsp 文件中包含以下内容 但它不起作用 它没有获取 header js 当我查看源代码并尝试单击 src 链接时 它显示资源
  • 如何验证共享点列表中的表单字段?

    我想在添加 编辑时验证列表项的字段并停止保存操作并提供用户在该页面本身上所做的错误信息 例如 如果我想阻止用户在保存之前根据另一个字段的特定状态保留几个字段设置 我不能将该字段设置为必填字段 使用预保存操作 将名为 PreSaveActio
  • 如何将maven版本从3.XX降级到2.2.1?

    我在构建需要 maven 2 2 1 才能构建的项目时遇到问题 如何降级maven版本 编辑 更多信息 我正在尝试从命令行构建项目 我正在本地构建这个 我当前安装的是 3 0 4 版本 您可以安装多个版本的 Maven 您没有提供很多其他必
  • 保存用户名和高分的最佳方法是什么

    在我的应用程序中 我需要保存一个双值 高分 和字符串 玩家名称 我应该使用什么来获得这个 任何想法都会很棒 谢谢 如果这就是你要节省的全部NS用户默认值应该没事 To store NSUserDefaults standardUserDef
  • sql server中的列到行?

    Table CREATE TABLE Table1 col1 INT col2 nvarchar 10 col3 INT col4 INT INSERT INTO Table1 col1 col2 col3 col4 VALUES 1 we
  • UIWebView 未完成加载?

    我的应用程序中有一个 webview 它加载大部分页面 并且加载完成时调用函数 webViewDidFinishLoad 但是 尽管页面似乎已加载 但某些页面加载并未完成 在这些情况下 void webViewDidFinishLoad U
  • 有没有办法检测 SQL Server 分层查询中的循环?

    在Oracle中 我们可以使用该函数CONNECT BY ISCYCLE检测分层查询中的循环 我尝试在 SQL Server 中做同样的事情 有没有办法做到这一点 多谢 连接记录 ID 根据记录的 ROW NUMBER 构建位图 并根据列表
  • 如何修改/部分删除 BTreeMap 中的范围?

    我正在尝试建立一个RangeSet出于一个BTreeMap 其中键是下限 值是上限 只要我只是查找东西 这就非常有效 然而 第一个变异方法让我难住了 如果我想insert我的集合的范围 我需要检查Range of my BTreeMap从尾
  • Spring JPA 的多租户

    我正在为我的 Web 应用程序寻找多租户解决方案 我想用单独的架构模型实现一个应用程序 我想每个会话都有一个数据源 为了做到这一点 我将数据源和实体管理器放在会话范围内 但这不起作用 我正在考虑在用户输入用户名和密码以及tenantId时加
  • 从钥匙串中检索 SecKey

    我正在尝试升级我从中获得的代码这个答案用于生成 CSR 从 Swift 2 到 Swift 3 我已升级大部分代码 但原始答案的实用程序块中的以下代码失败并出现错误 init 不可用 使用 withMemoryRebound to capa
  • 更改 SignalR Core 中的全局设置配置

    我在用SignalR 核心 with ASP NET核心 我想覆盖环球主机signalR 的设置 我正进入 状态this protected void Application Start object sender EventArgs e
  • Excel VBA:获取包含选定范围内数据的最后一个单元格

    如何使用 Excel VBA 获取包含特定范围 例如 A 列和 B 列 内的数据的最后一个单元格Range A B using Find像下面这样很有用 因为它 可以立即找到二维范围中的最后一个 或第一个 单元格 测试Nothing识别空白
  • 函数返回未定义的、预期的 Promise 或值

    当我在 firebase 上触发简单数据库触发器时 然后它会显示这样的错误 函数返回未定义的预期 Promise 或值 const firebase require firebase admin const functions requir
  • mldivide 是否始终与 MATLAB 中的 OLS 相同?

    我正在对一些替代线性回归技术进行比较 显然 这些将相对于 OLS 普通最小二乘法 进行基准测试 但我只想要一个纯粹的 OLS 方法 不需要对数据进行预处理来发现数据中的不良条件 就像您在使用时发现的那样regress 我本来希望简单地使用经
  • PHP 点击事件处理程序

    我是 PHP 编程新手 我想知道是否可以像在 ASP NET 中那样处理 PHP 事件 我的意思是我有一个 img 我想在该 img 的单击事件上执行一些任务 我知道如何在 ASP NET 中执行此操作 但请在 PHP 上下文中帮助我 谢谢
  • 集合已修改;枚举操作可能无法执行

    我的 TabControl 中有多个 TabItem tabItem1 tabItem2 tabItem3 这些是 CloseableTabItem 如果我在 tabItem1 中添加一个节点并按下按钮为该节点创建子图模型 则 相同的节点应