Why can't I change elements from a linq IEnumerable in a for loop?

后端 未结 3 873
自闭症患者
自闭症患者 2020-12-20 20:08

Yesterday I wrote the following c# code (shortened a bit for legibility):

 var timeObjects = ( from obj in someList
                     where ( obj.StartTim         


        
相关标签:
3条回答
  • 2020-12-20 20:37

    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.

    0 讨论(0)
  • 2020-12-20 20:42

    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.

    0 讨论(0)
  • 2020-12-20 20:52

    It seems until calling ToList() it isn't IEnumerable but IQueryable, so changes are made to temporary objects.

    0 讨论(0)
提交回复
热议问题