Foreach和更改的项目应该更多

时间:2013-11-30 16:09:54

标签: c#

我有一个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。

2 个答案:

答案 0 :(得分:2)

检查收集时,您还会在循环之前获得Enum.Something的项目,但由于随机性而没有添加到列表中。

请记住,在C#中,您有对象的引用,因此,当您更改循环中的项目时,它也会在原始集合中更改。

答案 1 :(得分:0)

可能是您无意中在某处共享对象引用。你正在践踏共享状态。在添加之前,列表可能不是空的。谁知道呢。

这就是函数式编程风格如此强大的原因。你应该写:

var anotherList =
collection
.Where(_ => random.NextDouble() < somedouble)
.Select(item => item.CreateCopyWithEnum(Enum.Something))
.ToList();

创建一些对象或列表后,尽量不要触摸它,因为您可能会无意中破坏依赖于数据保持稳定的其他代码。