Object == Object2存储在List <t>中,但不存在于IEnumerable <t>中的对象 - 为什么?</t> </t>

时间:2014-01-04 23:24:30

标签: asp.net-mvc linq entity-framework list ienumerable

使用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

,结果是假的。

2 个答案:

答案 0 :(得分:0)

我认为这是因为在第一个示例中,您从数据库中获取了两个对象。首先来自迭代,然后是第二次来自Last()

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

答案 1 :(得分:-1)

这是因为您不允许在Last个对象上使用LastOrDefaultDbSet。相反,您应该使用OrderByDescending(t=>t.ID).First()