为什么不执行IEnumerable中字段的更改?

这是一个惊喜,发现以下调用似乎不记得对该字段所做的更改。

private void Foo(IEnumerable blopps) { foreach (Blopp blopp in blopps) blopp.SomeField = PREFIX + blopp.SomeField; String test = blopps.First().SomeField; } 

使用LINQ to data获取数组时, 测试变量缺少前缀。 我需要评估IEnumerable并将其设为List以便对字段进行更改维持。 为什么会这样? 我希望程序能够识别出该字段以后会使用并对其进行评估。

 private void Foo(IEnumerable _blopps) { List blopps = _blopps.ToList(); foreach (Blopp blopp in blopps) blopp.SomeField = PREFIX + blopp.SomeField; String test = blopps.First().SomeField; } 

这取决于你传递给它的东西。 如果它是一个懒惰的评估序列 ,那么每次你“看” blopps ,它将重新评估输入。

如果传入类似List ,序列每次都会包含相同的精确值,所以没关系。 如果传入非实现查询,则每次查看输入时都会执行查询。 是否返回对先前评估的相同对象的引用将取决于它正在做什么。

(正如评论中所指出的,在某些情况下,对一个评估返回的对象的更改甚至可以完全改变查询的结果 – 可以修改对象,使得它们不会匹配查询中较早的filter。 )