1

令人惊讶的是,以下调用似乎不记得对该字段所做的更改。

private void Foo(IEnumerable<Blopp> 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<Blopp> _blopps)
{
  List<Blopp> blopps = _blopps.ToList();
  foreach (Blopp blopp in blopps)
    blopp.SomeField = PREFIX + blopp.SomeField;

  String test = blopps.First().SomeField;
}
4

1 回答 1

8

这取决于您传递给它的内容。如果它是一个惰性求值的序列,那么每次您“查看”时blopps,它都会重新评估输入。

如果您传入类似 a 的内容List<T>,则序列每次都将包含相同的确切值,所以这很好。如果您传入一个未实现的查询,它将在您每次查看输入时执行该查询。是否返回对与先前评估相同的对象的引用将取决于它在做什么。

(正如评论中所指出的,在某些情况下,对一次评估返回的对象的更改甚至可能会完全改变查询的结果 - 对象可以以这样的方式进行修改,即它们与查询中的早期过滤器不匹配。 )

于 2013-01-16T14:50:53.970 回答