从 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);
}
}
我遇到了 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 changedtmp_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);
}
}