Contains の複数の呼び出しが同じ enumerable の同じパラメーターに対して異なる値を返す理由を理解できません。コレクションを変更して、後続の呼び出しで結果を変更できることは理解していますが、ここでは除外できます。
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
}
これを実際のリストを使用するように変更すると、すべてが期待どおりに機能します。
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
}
};
}
さて、デバッグからModel.Project.Domains
、正しい値だけでなく正しい数のエントリが含まれることがわかっていますが、メソッドで .Contains() を呼び出すと、true または false のいずれかの任意の結果が返されます。
実際、Contains() 呼び出しを含む行をデバッガーの [ウォッチ] タブに複数回配置すると、ハードコードされた引数 (4 など)を使用しても、呼び出しごとに結果が交互true
に変わります。false
ここで何が起こっているのか、私は何を見落としているのでしょうか?
Model.Project.Domains がインスタンス化される方法のため、その実際の型は aWhereSelectEnumerableIterator<T>
ですが、これは実装されIEnumerable<T>
ているため、問題になることはありません...