从 ObservableCollection 中删除项目

时间:2021-04-21 12:23:17

标签: c# observablecollection

我在使用 ObservableCollection 时遇到问题。我有两个ObservableCollection。一个是旧的,另一个是新的。我想检查旧项目中是否有新项目中没有的项目,然后将它们删除(从旧项目中删除)。

public class Class1
{
    private ObservableCollection<String> m_Files = new ObservableCollection<String>();

    public void update()
    {
        ObservableCollection<String> tmp_Files = new ObservableCollection<String>();
        tmp_Files.Add("Foo");
        tmp_Files.Add("Bar");
    
        this.m_Files.Add("Boing");
        this.m_Files.Add("Foo");
        this.m_Files.Add("Bar"); 

        this.m_Files = RemoveObsoleteFiles(this.m_Files, tmp_Files);
    }


    private ObservableCollection<String> RemoveObsoleteFiles(ObservableCollection<String> files_OLD, ObservableCollection<String> files_NEW)
    {
        ObservableCollection<String> result = files_OLD;
        foreach (String item in files_OLD)
        {
            if (!files_NEW.Contains(item))
            {
                result.Remove(item);
            }
        }
        return result;
    }
}

调用 RemoveObsoleteFiles() 方法时出现错误:

<块引用>

System.InvalidOperationException: '集合已修改;枚举操作可能不会执行。'

单步执行代码时,我注意到当 result 发生变化时,tmp_Files 也会发生变化。

这是为什么?我该如何避免?

1 个答案:

答案 0 :(得分:2)

<块引用>

单步执行代码时,我注意到当 result 发生变化时,tmp_Files 也会发生变化。

那是因为它们引用了同一个集合。如果您不希望 tmp_Files 更改,那么您需要复制它:

ObservableCollection<String> result = new Observablecollection<String>(files_OLD)

但是,我怀疑这不是问题,因为您无论如何都不会对 tmp_files 执行任何操作,但最好不要修改传入的集合并返回修改后的副本。

至于例外,当您使用 foreach 迭代集合时,您无法从集合中删除项目。在循环时删除项目的最简单方法是使用 for 循环并向后迭代(做一些研究以找出原因):

for(int i=files_OLD.Count - 1; i>=0; i--)
{
    String item = files_OLD[i];
    if (!files_NEW.Contains(item))
    {
        result.Remove(item);
    }
}
相关问题