Model view controller IEnumerable的返回值<;T>;。如果多次调用,则包含更改

Model view controller IEnumerable的返回值<;T>;。如果多次调用,则包含更改,model-view-controller,ienumerable,linq-to-objects,contains,Model View Controller,Ienumerable,Linq To Objects,Contains,我很难理解为什么多次调用Contains在同一个可枚举项上为同一参数返回不同的值。 虽然我知道可以修改集合,从而在后续调用中更改结果,但这里可以排除这种情况 在MVC视图中考虑以下(精简)代码。 这样做的目的是显示复选框列表(因为没有HTML帮助程序),并通过模型的属性确定在打开视图时应选中哪些复选框 @foreach (var d in Model.AllDomains) { bool isChecked = Model.Project.Domains.Contains(d.ID);

我很难理解为什么多次调用Contains在同一个可枚举项上为同一参数返回不同的值。 虽然我知道可以修改集合,从而在后续调用中更改结果,但这里可以排除这种情况

在MVC视图中考虑以下(精简)代码。 这样做的目的是显示复选框列表(因为没有HTML帮助程序),并通过模型的属性确定在打开视图时应选中哪些复选框

@foreach (var d in Model.AllDomains) {
    bool isChecked = Model.Project.Domains.Contains(d.ID);
    <input @(isChecked ? "checked=\"checked\" " : "")type="checkbox" value="@d.ID" />
    // more stuff here
}
现在,在调试过程中,我知道
Model.Project.Domains
将包含正确数量的条目和正确的值,对方法调用.Contains()将返回一个任意结果——true或false

事实上,如果我多次将带有Contains()调用的行放入调试器的“Watch”选项卡,即使使用硬编码参数(例如4),每次调用的结果都会从
true
变为
false

这里发生了什么,我忽略了什么?


由于Model.Project.Domains的实例化方式,它的实际类型是
其中selectEnumerableIterator
,但是这实现了<>代码> iQueabd,这不应该是一个问题…

< p>看来,问题的根本原因是我们的对象模型的基础类中枚举器的一个草率/不寻常的实现,它使<代码> GeQueRealAdvor()/代码>返回一个已经在以前的调用

中使用的迭代器。 由于
Contains()
在找到第一个匹配项后停止对集合进行迭代,因此,如果查找的值位于上一次迭代中已搜索的部分中,则该枚举数将返回false。
<代码>包含()<代码>的结果导致枚举器内部重置,这解释了在我原来的POST.

< P>中描述的“切换”结果,似乎问题的根本原因是我们的对象模型的基础类中枚举器的草率/不寻常的实现,它使<代码> GeQueRealAtter()返回上一次调用中已使用的迭代器

由于
Contains()
在找到第一个匹配项后停止对集合进行迭代,因此,如果查找的值位于上一次迭代中已搜索的部分中,则该枚举数将返回false。
Contains()
的否定结果导致枚举数在内部重置,这解释了我在原始帖子中描述的“切换”结果

var tmp = Model.Project.Domains.ToList();
@foreach (var d in Model.AllDomains) {
    bool isChecked = tmp.Contains(d.ID);
    <input @(isChecked ? "checked=\"checked\" " : "")type="checkbox" value="@d.ID" />
    // more stuff here
}
public ProjectVM GetByID(int id) {
    return new ProjectVM {
        Project = new Project {
            ... // Other properties here
            Domains = from d in MyObjectModel.Projects[id].Domains
                      select d.ID
        },
        AllDomains = from d in MyObjectModel.Domains
                     orderby d.Name
                     select new {
                         ID = d.ID,
                         Name = d.Name
                     }
    };
}