Yesterday I wrote the following c# code (shortened a bit for legibility):
var timeObjects = ( from obj in someList
where ( obj.StartTim
Your timeObjects
is a delayed-execution enumerable. If you enumerate over the list twice, the results will actually be evaluated twice, creating new objects.
When you performed ToList(), it created a local copy of the RESULTS of that query/enumerable, which is why you saw the changes. This sort of LINQ query doesn't create any sort of list under the covers. The query itself isn't performed until you enumerate over it. All you're doing in the (from ... select) state is creating the query definition.
Your original timeObjects definition defines a LINQ expression that gets lazily evaluated, so everytime you try to go over the timeObjects enumerable, it will create new instances of MyObject.
It seems until calling ToList() it isn't IEnumerable but IQueryable, so changes are made to temporary objects.