Asp.net mvc Object==Object2当存储在List中时,而不是当Object存储在IEnumerable中时-为什么?

Asp.net mvc Object==Object2当存储在List中时,而不是当Object存储在IEnumerable中时-为什么?,asp.net-mvc,linq,entity-framework,list,ienumerable,Asp.net Mvc,Linq,Entity Framework,List,Ienumerable,使用ASP MVC5和EF6 前几天,当foreach循环到达最后一个元素时,当我希望有不同的行为时,我遇到了一个奇怪的情况。 如果将对象与集合上的.Last方法的结果进行比较,则循环不会进入if条件 我迭代的集合类似于: public class CollectionClass{ IEnumerable<TestClass1> CollectionA IEnumerable<TestClass2> CollectionB } 正如我所期望的,循环在最后

使用ASP MVC5和EF6

前几天,当foreach循环到达最后一个元素时,当我希望有不同的行为时,我遇到了一个奇怪的情况。 如果将对象与集合上的.Last方法的结果进行比较,则循环不会进入if条件

我迭代的集合类似于:

public class CollectionClass{
    IEnumerable<TestClass1> CollectionA
    IEnumerable<TestClass2> CollectionB
}
正如我所期望的,循环在最后一次迭代中进入了第一个if条件

为什么会有这种差异?当对象存储在列表中时,为什么equals运算符==的计算结果为TRUE;当对象存储在IEnumerable中时,为什么为FALSE? 我知道IEnumerable是一个接口——这就是区别所在吗

我甚至做了一个明确的测试:

var obj1 = cc.CollectionA.Last();
var obj2 cc.CollectionA.Last();
bool result = obj1 == obj2; //result = FALSE

结果是错误的。

我认为这是因为在第一个示例中,您从数据库中获取了两个对象。第一个从迭代开始,第二个从调用到最后


在第二个示例中,所有对象都是在您将集合分配给您调用ToList的CollectionA和CollectionB时创建的。

这是因为不允许在DbSet对象上使用Last和LastOrDefault。相反,您应该使用orderbydegending=>t.ID.First

您的代码甚至无法编译。您正在尝试在cc上迭代,它没有实现IEnumerable或GetEnumerator方法。如果你能发布一个简短但完整的程序来演示这个问题,帮助你会容易得多。敏锐的眼睛!修复了迭代cc.collectiona的代码示例。这仍然不是一个简短但完整的示例…cc.Last做了什么?抱歉,我真的很累,所以在代码示例中遗漏了一些明显的错误。它应该是cc.CollectionA.Last;谢谢,我相信这一定是答案。我甚至通过执行以下操作来显式比较项目:var obj1=cc.CollectionA.First;变量obj2 cc.CollectionA.First;bool结果=obj1==obj2;结果为FALSE。您可以确定是否打开了SQL探查器或实体框架探查器。如果我是对的,你会看到不同的数据库调用——我是对的;如果最后一个代码段对列表集合返回true,那么您就知道发生了什么,并且不必运行任何探查器。
public class CollectionClass{
    List<TestClass1> CollectionA
    List<TestClass2> CollectionB
}
CollectionClass cc = new CollectionClass {
   CollectionA = db.TestClasses1.ToList(), 
   CollectionB = db.TestClasses2.ToList()
}; //Added .ToList()
var obj1 = cc.CollectionA.Last();
var obj2 cc.CollectionA.Last();
bool result = obj1 == obj2; //result = FALSE