【问题标题】:adding or removing from an observable collection within ForEach从 ForEach 中的可观察集合中添加或删除
【发布时间】:2017-06-09 14:10:52
【问题描述】:

我认为我不能在下面的 foreach 循环中修改可观察的集合 'varieties' - 只要满足 'if' 中的条件,就会发生 'Remove',然后当 foreach 仍然具有大部分要通过的集合。

我对其进行了更改,以便如果满足条件而不是从品种中删除,它会将品种添加到新列表中,但在第一次满足 foreach 存在时再次满足条件。

我错过了什么吗?

foreach (Variety variety in varieties)
 {
     if (variety.Type != main.Type && variety.Type != null)
      {
           varieties.Remove(variety);
       }
 }

更改代码:

foreach (Variety variety in varieties)
 {
     if (variety.Type == main.Type || variety.Type == null)
      {
           FilteredVarieties.Add(variety);
       }
 }

【问题讨论】:

    标签: c# mvvm observablecollection


    【解决方案1】:

    您不能在 foreach 中修改源集合。如果你真的想修改,尝试在foreach中循环并在里面修改它。

     var sourcecopy=varieties;
     foreach (Variety variety in sourcecopy)
     {
     if (variety.Type != main.Type && variety.Type != null)
      {
           varieties.Remove(variety);
       }
     }
    

    【讨论】:

      【解决方案2】:

      您不能在 foreach 循环中从您的收藏中删除项目。当您说foreach 时发生了什么,它实际上是在创建一个从 0 到集合的原始计数的 for 循环。因此,一旦您删除了某些内容并且集合的计数发生了变化,循环的范围就不会更新。

      如果你切换到普通的for 循环,你应该会很好。

      【讨论】:

        【解决方案3】:

        正如其他人(和编译器)可能所说的那样,您无法更改以这种方式枚举的集合。但是,如果您在 foreach 定义中 .ToList() 您的集合,您实际上是在枚举列表的副本,因此可以随意删除或添加到您的原始列表中。

        foreach (Variety variety in varieties.ToList())
        {
            if (variety.Type != main.Type && variety.Type != null)
            {
                 varieties.Remove(variety);
            }
        }
        

        【讨论】:

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