从嵌套Foreach中的Observable Collection中删除项目

时间:2014-05-13 19:19:06

标签: c# wpf for-loop foreach

我有这些嵌套的Foreach:

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

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

enter image description here

有没有办法实现这个目标?

提前致谢。

3 个答案:

答案 0 :(得分:5)

您需要添加' ToList'如果要删除集合中的项目,请使用语句:

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

答案 1 :(得分:1)

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

时使MoveNext无效

尝试:

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);

答案 2 :(得分:0)

尝试类似

的内容
List<string> ocChoicesinItem = new List<string>{"One", "Two", "Three"};
List<string> ItemsInInvoiceChoices = new List<string> { "Three" };

ocChoicesinItem.RemoveAll(x => ItemsInInvoiceChoices.Contains(x));

显然我正在使用字符串,因为我不知道你的收藏品包含哪种类型;您可能需要比较谓词中的ID。