从 ObservableCollection 中移除项目

Removing items from 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: 'Collection was modified; enumeration operation may not execute.'

单步执行代码我注意到当 result 改变时 tmp_Files 也会改变。

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

Stepping through the code I noticed that when result is changed tmp_Files also changes.

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

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

但是,我怀疑这不是问题,因为无论如何您都不会对 tmp_files 做任何事情,但是最好不要修改传入的集合,而 return 修改后的集合复制.

至于例外情况,当您使用 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);
    }
}