我在使用 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
也会发生变化。
这是为什么?我该如何避免?
答案 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);
}
}