[英]Modifying a Collection in a Foreach Loop C#
我在foreach
循环期间更新ObservableCollection
中的项目时遇到问题。 基本上,我有一个ObservableCollection
员工,他们在模型中有一个字段来确定他们是否在建筑物中。
我一直在查看数据库表,以检查每位员工,以查看此状态是否有任何变化。 这就是我在C#
执行此操作的方式;
public ObservableCollection<EmployeeModel> EmployeesInBuilding {get; set; }
public ObservableCollection<EmployeeModel> Employees {get; set; }
var _employeeDataService = new EmployeeDataService();
EmployeesInBuilding = _employeeDataService.GetEmployeesInBuilding();
foreach (EmployeeModel empBuild in EmployeesInBuilding)
{
foreach (EmployeeModel emp in Employees)
{
if (empBuild.ID == emp.ID)
{
if (empBuild.InBuilding != emp.InBuilding)
{
emp.InBuilding = empBuild.InBuilding;
int j = Employees.IndexOf(emp);
Employees[j] = emp;
employeesDataGrid.Items.Refresh();
}
}
}
}
这可以正确地拾取两个ObseravbleCollections
之间的ObseravbleCollections
,但是当我去更新现有的ObservableCollection
我得到一个例外: Collection was modified; enumeration operation may not execute.
Collection was modified; enumeration operation may not execute.
如何防止这种情况发生并仍然修改原始集合?
只需设置元素的属性,就无需替换Employees
集合中的元素。
取而代之的是,您的EmployeeModel类应实现INotifyPropertyChanged
接口,并在InBuilding
属性更改时引发PropertyChanged
事件:
public class EmployeeModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool inBuilding;
public bool InBuilding
{
get { return inBuilding; }
set
{
if (inBuilding != value)
{
inBuilding = value;
OnPropertyChanged("InBuilding");
}
}
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
...
}
现在可以将更新代码的内部循环简化为:
foreach (var emp in Employees)
{
if (empBuild.ID == emp.ID)
{
emp.InBuilding = empBuild.InBuilding;
}
}
或者,您可以像这样编写整个更新循环:
foreach (var empBuild in EmployeesInBuilding)
{
var emp = Employees.FirstOrDefault(e => e.ID == empBuild.ID);
if (emp != null)
{
emp.InBuilding = empBuild.InBuilding;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.