我有一个foreach循环遍历一个列表,里面有以下代码:
foreach(var item in collection)
{
if(random.NextDouble() < somedouble)
{
item.Something = Enum.Something;
anotherList.Add(item);
}
}
然后当我计算anotherList
中的项目时:
int anotherListCount = anotherList.Count;
我会收到40个项目,当我计算item.Something = Enum.Something
条件的项目时:
int count = collection.Count(item => item.Something == Enum.Something);
我会收到50-60项(更多)。
为什么它会改变更多的项目?一个简单的for
也是如此。
更新:
在item
的构造函数中,我设置了Enum.NotSomething,因此Enum.Something不存在任何内容。我在循环之前运行Count
方法,它表示0。
答案 0 :(得分:2)
检查收集时,您还会在循环之前获得Enum.Something
的项目,但由于随机性而没有添加到列表中。
请记住,在C#中,您有对象的引用,因此,当您更改循环中的项目时,它也会在原始集合中更改。
答案 1 :(得分:0)
可能是您无意中在某处共享对象引用。你正在践踏共享状态。在添加之前,列表可能不是空的。谁知道呢。
这就是函数式编程风格如此强大的原因。你应该写:
var anotherList =
collection
.Where(_ => random.NextDouble() < somedouble)
.Select(item => item.CreateCopyWithEnum(Enum.Something))
.ToList();
创建一些对象或列表后,尽量不要触摸它,因为您可能会无意中破坏依赖于数据保持稳定的其他代码。