使用ASP MVC5和EF6。
前几天,当foreach-loop到达最后一个元素时,我有一个不同的行为,我有一个好奇的案例。 循环不会进入if-condition将对象与.Last() - 方法的结果进行比较。
我正在迭代的集合是:
public class CollectionClass{
IEnumerable<TestClass1> CollectionA
IEnumerable<TestClass2> CollectionB
}
我的代码类似于:
DbContext db = new DbContext(); //just for illustration, not actual code
CollectionClass cc = new CollectionClass {
CollectionA = db.TestClasses1,
CollectionB = db.TestClasses2
};
//(TestClasses1 and TestClasses2 are DbSet<T> properties of my DbContext.
foreach(TestClass1 tc1 in cc.CollectionA)
{
if (tc1 == cc.CollectionA.Last()){ //<---NEVER enters in here!!
//doStuff
}
else{
//doOtherStuff
}
}
使用上面的代码,循环永远不会进入if条件,即使是最后一个元素也是如此。 但是当我将 CollectionClass 更改为:
时public class CollectionClass{
List<TestClass1> CollectionA
List<TestClass2> CollectionB
}
并实例化 CollectionClass - 对象,如下所示:
CollectionClass cc = new CollectionClass {
CollectionA = db.TestClasses1.ToList(),
CollectionB = db.TestClasses2.ToList()
}; //Added .ToList()
循环按照我的预期进入最后一次迭代的第一个if条件。
为什么会出现这种差异?为什么当对象存储在List中时,equals-operator(==)求值为TRUE,当对象存储在IEnumerable中时,为什么得到FALSE? 我知道IEnumerable是一个接口 - 是什么产生了不同?
我甚至做过以下各种明确的测试:
var obj1 = cc.CollectionA.Last();
var obj2 cc.CollectionA.Last();
bool result = obj1 == obj2; //result = FALSE
,结果是假的。
答案 0 :(得分:0)
我认为这是因为在第一个示例中,您从数据库中获取了两个对象。首先来自迭代,然后是第二次来自Last()
。
在第二个示例中,所有对象都是在您将集合分配给CollectionA
和CollectionB
时创建的(您调用ToList()
)。
答案 1 :(得分:-1)
这是因为您不允许在Last
个对象上使用LastOrDefault
和DbSet
。相反,您应该使用OrderByDescending(t=>t.ID).First()