【问题标题】:Remove item from Observable Collection in Nested Foreach [duplicate]从嵌套 Foreach 中的可观察集合中删除项目 [重复]
【发布时间】:2014-05-13 19:19:06
【问题描述】:

我有这些嵌套的 Foreach :

foreach (var item1 in ocChoicesinItem)
        {
            foreach (var item2 in temp.ItemsInInvoiceChoices)
            {
                if (item1.ChoicesId == item2.ChoicesId)
                    ocChoicesinItem.Remove(item1);
            }
        }

从 ocChoicesinItem 中删除项目时出现问题,给我这个错误:

有没有办法做到这一点?

提前致谢。

【问题讨论】:

    标签: c# wpf for-loop foreach


    【解决方案1】:

    如果要删除集合中的项目,则需要添加“ToList”语句:

    foreach (var item1 in ocChoicesinItem.ToList())
        {
            foreach (var item2 in temp.ItemsInInvoiceChoices)
            {
                if (item1.ChoicesId == item2.ChoicesId)
                    ocChoicesinItem.Remove(item1);
            }
        }
    

    【讨论】:

      【解决方案2】:

      您无法在迭代该集合时修改该集合,因为您在调用 MoveNext 时使您的 Enumerator 无效

      试试:

      public static class ExtensionMethods
      {
         public static int RemoveAll<T>(
            this ObservableCollection<T> coll, Func<T, bool> condition)
       {
            var itemsToRemove = coll.Where(condition).ToList();
      
            foreach (var itemToRemove in itemsToRemove)
            {
                coll.Remove(itemToRemove);
            }
      
            return itemsToRemove.Count;
       }
      }  
      
      ocChoicesinItem.RemoveAll(x => temp.ItemsInInvoiceChoices.Any(y => y.ChoicesId == x.ChoicesId);
      

      【讨论】:

      • 只有 Remove 或 RemoveAt,没有 RemoveAll ??
      • 我为此添加了一个扩展方法。
      • 或者...您可以使用 Seb 的答案。在迭代期间将Enumerable 转换为列表。
      • 谢谢你们帮助我:)
      • 哪个最适合他
      【解决方案3】:

      试试类似的东西

      List<string> ocChoicesinItem = new List<string>{"One", "Two", "Three"};
      List<string> ItemsInInvoiceChoices = new List<string> { "Three" };
      
      ocChoicesinItem.RemoveAll(x => ItemsInInvoiceChoices.Contains(x));
      

      显然我使用的是字符串,因为我不知道您的集合包含什么类型;您可能需要比较谓词中的 ID。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多