Ever faced any of these questions?
My enumeration is empty!?
Where did my items go?
Why do Linq remove things I don’t want removed?
Where´s the items in my Where?!
I just did.
Linq is a nice little feature but when using enumerations you really need to keep your fingers crossed. Enumerations aren’t evaluated until you actually step through them so if you´re doing something like this:
// Select all items that fullfill a criteria, remove them and add them in the beginning of the list
var myItems = selection.Where(d => otherItems.Contains(d.Id));
selection.RemoveAll(myItems.Contains);
selection.InsertRange(0, myItems);
You´re gonna get in trouble. Since we get an enumerable, this will be evaluated as a selected portion from the actual list, that is not an actual selection. So when getting to the RemoveAll we actually remove the items from Both selections, dough!
A simple yet crude way to solve this is to force the creation of a new selection using the ToList method to create a new list which will evaluate the entire enumeration and giving us a new collection:
var myItems = selection.Where(d => otherItems.Contains(d.Id)).ToList();