Question

Using ASP MVC5 and EF6.

I had a curious case the other day when I was looking to have different behaviour when a foreach-loop got to the last element. The loop wouldn't enter if-condition comparing the object with the result from .Last()-method on the collection.

The collection I was iterating over was something like:

public class CollectionClass{
    IEnumerable<TestClass1> CollectionA
    IEnumerable<TestClass2> CollectionB
}

My code was something like:

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
  }
}

With the code above, the loop never entered into the if-condition, even for the last element, which one would expect. But when changed my CollectionClass to:

public class CollectionClass{
    List<TestClass1> CollectionA
    List<TestClass2> CollectionB
}

and instantiated the CollectionClass-object like this:

CollectionClass cc = new CollectionClass {
   CollectionA = db.TestClasses1.ToList(), 
   CollectionB = db.TestClasses2.ToList()
}; //Added .ToList()

the loop entered into the first if-condition at the last iteration as I expected.

Why this difference? Why did the equals-operator (==) evaluate to TRUE when the object had been stored in a List and FALSE when the object was stored in an IEnumerable? I know that IEnumerable is an interface -- is that what makes the difference?

I even did an explicit test in the sorts of:

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

and the result was FALSE.

Was it helpful?

Solution

I think it's because in first example you get two objects from database. First from iteration and second from call to Last().

In second example all objects are created at the time you assign collections to CollectionA and CollectionB (you call ToList()).

OTHER TIPS

It is because you are not allowed to use Last and LastOrDefault on DbSet objects. Instead you should use OrderByDescending(t=>t.ID).First()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top