在 C# 中,我注意到如果我在生成的 LINQ 上运行 foreach 循环IEnumerable<T>
集合并尝试修改每个T元素的内容,我的修改are not执着的。
另一方面,如果我应用ToArray()
or ToList()
创建集合时的方法,修改 foreach 循环中的各个元素are执着的。
我怀疑这在某种程度上与延迟执行有关,但具体如何对我来说并不完全明显。我真的很感谢对这种行为差异的解释。
这是一些示例代码 - 我有一个课程MyClass
具有构造函数和自动实现的属性:
public class MyClass
{
public MyClass(int val) { Str = val.ToString(); }
public string Str { get; set; }
}
在我的示例应用程序中,我使用 LINQSelect()
创建两个集合MyClass
基于整数集合的对象,一个IEnumerable<MyClass>
,和一个IList<MyClass>
通过应用ToList()
方法最后。
var ints = Enumerable.Range(1, 10);
var myClassEnumerable = ints.Select(i => new MyClass(i));
var myClassArray = ints.Select(i => new MyClass(i)).ToList();
接下来,我对每个集合运行 foreach 循环,并修改循环的内容MyClass
对象:
foreach (var obj in myClassEnumerable) obj.Str = "Something";
foreach (var obj in myClassArray) obj.Str = "Something else";
最后我输出了Str
每个集合中第一个元素的成员:
Console.WriteLine(myClassEnumerable.First().Str);
Console.WriteLine(myClassArray.First().Str);
有点违反直觉,输出是:
1
Something else