C# 我是否正确使用了IEnumerable?

C# 我是否正确使用了IEnumerable?,c#,C#,我对以下代码感到头痛。看起来很直截了当,但我不明白为什么会出错 想法很简单,我只是循环将DataGirdView的引用添加到ViewModel的属性中。就这些 但是在我修改了ViewModel中的值之后,IEnumerable VM将不会反映它,就好像它没有发生一样。我做错了什么?请帮忙 public void UpdateCompany(IEnumerable<ICompanyViewModel> vms) { CompanyBindingSource.Da

我对以下代码感到头痛。看起来很直截了当,但我不明白为什么会出错

想法很简单,我只是循环将DataGirdView的引用添加到ViewModel的属性中。就这些

但是在我修改了ViewModel中的值之后,
IEnumerable VM
将不会反映它,就好像它没有发生一样。我做错了什么?请帮忙

    public void UpdateCompany(IEnumerable<ICompanyViewModel> vms) {
        CompanyBindingSource.DataSource = new BindingListView<CompanyViewModel>(vms.ToList());
        var lst = new List<DataGridViewRow>();
        foreach (DataGridViewRow dgvr in DataGridView1.Rows) lst.Add(dgvr);
        foreach (var vm1 in vms) { 
            foreach (var dgvr in lst) {
                var ov = (ObjectView<CompanyViewModel>)dgvr.DataBoundItem;
                var vm2 = (ExhibitorViewModel)ov.Object;
                if (vm1.ID == vm2.ID) {
                    vm1.DataGridViewRow = dgvr;
                    break;
                }
            }                
            if (vm1.DataGridViewRow != null) lst.Remove(vm1.DataGridViewRow); 

        } // I can see DataGridViewRows being matched with vm1.
    }     // Then, I expand IEnumerable 'vms' and check the value again. All
          // the ViewModels lost their references to the matching DataGridViewRows.
          // In every ViewModel.DataGridViewRow = null; WHY IS THIS HAPPENING?? 


//.... here is the background code of my model

public class CompanyViewModel : BaseViewModel, ICompanyViewModel {
    public DataGridViewRow DataGridViewRow { get; set; }
    public ICompany Company { get; set; }
    public long ID {
        get { return Company.ID; }
    }
    public string Name {
        get { return Company.Name; }
        set { Company.Name = value; }
    }
}    
public interface ICompanyViewModel : IViewModel {
    DataGridViewRow DataGridViewRow { get; set; }
    public ICompany Company { get; set; }
    long ID { get; }
    string Name { get; set; }
}
public interface IViewModel { }
public abstract class BaseViewModel : IViewModel { }
public void UpdateCompany(IEnumerable虚拟机){
CompanyBindingSource.DataSource=新的BindingListView(vms.ToList());
var lst=新列表();
foreach(DataGridView1.Rows中的DataGridViewRow dgvr)lst.Add(dgvr);
foreach(vms中的var vm1){
foreach(lst中的var dgvr){
var ov=(ObjectView)dgvr.DataBoundItem;
var vm2=(ExhibitorViewModel)ov.Object;
if(vm1.ID==vm2.ID){
vm1.DataGridViewRow=dgvr;
打破
}
}                
如果(vm1.DataGridViewRow!=null)lst.Remove(vm1.DataGridViewRow);
}//我可以看到DataGridViewRows与vm1匹配。
}//然后,我展开IEnumerable“vms”并再次检查该值。全部的
//ViewModels丢失了对匹配DataGridViewRows的引用。
//在每个ViewModel中。DataGridViewRow=null;为什么会发生这种情况??
//.... 这是我的模型的背景代码
公共类公司视图模型:BaseViewModel、ICompanyViewModel{
公共DataGridViewRow DataGridViewRow{get;set;}
公共ICompany公司{get;set;}
公共长ID{
获取{return Company.ID;}
}
公共字符串名{
获取{return Company.Name;}
设置{Company.Name=value;}
}
}    
公共界面ICompanyViewModel:IViewModel{
DataGridViewRow DataGridViewRow{get;set;}
公共ICompany公司{get;set;}
长ID{get;}
字符串名称{get;set;}
}
公共接口IViewModel{}
公共抽象类BaseViewModel:IViewModel{}

如果您使用的是
IEnumerable
,您必须手动(明确地)告诉绑定机制(无论它是什么),更新

如果你不喜欢这个想法,那就考虑使用吧。
在这种情况下,
.net framework
本身会跟踪该集合中发生的
添加
删除
事件,并更新绑定到的绑定。

问题根源:IEnumerable的多个枚举

我不正确地使用了IEnumerable。根据Resharper的说法,我真的应该打电话给.ToList();当我得到IEnumerableVM的列表时


否则,每次我打电话给foreach。。。我正在再次有效地调用数据库!天哪,在这件事上不要犯错误是非常重要的,幸运的是我发现了

您是否尝试注释这一行:
if(vm1.DataGridViewRow!=null)lst.Remove(vm1.DataGridViewRow)只需关闭它,如果它工作得更好。