【发布时间】:2018-05-08 22:17:12
【问题描述】:
我注意到枚举集合的问题是.Select<T>() 的结果,我可以枚举它,并修改集合中的每个项目。当我在枚举完成后查看集合时,每个项目都未修改。
public class FooModel
{
public Guid? Id { get; set; }
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
IEnumerable<FooModel> foos = Enumerable.Range(0, 100)
.Select(m => new FooModel());
foreach(FooModel f in foos)
{
f.Id = Guid.NewGuid();
}
Assert.IsTrue(foos.All(foo => foo.Id.HasValue));
}
}
如果我附加 .ToList() 或 .ToArray() 来执行枚举,那么它会修改集合中的项目。
我知道IEnumerable 不会在.Select<T> 之后执行,但是当foreach 运行时,它会创建一个枚举器并在 foo 本地字段上执行 IEnumerable。为什么它不引用 Select<T> 创建的同一个对象?
我已经看到关于何时使用IEnumerable 而不是List 的问题,但我了解两者之间的区别。或多或少地描述与实施。我的问题更多是关于为什么 foreach 在本地字段上执行 IEnumerable 并且不对本地变量中引用的相同对象进行操作。
【问题讨论】:
标签: c# .net ienumerable