LINQ to Objects的奇怪行为

alf*_*alf 0 c# linq-to-objects list

我在代码中看到一个奇怪的行为,这是一个使用苹果和人的类似例子,但代码基本相同:

List<Apple> apples = ...
var selectableApples = apples.Select(a => new SelectableApple { SelectedByPerson = null, Apple = a });

foreach (Person person in persons)
{
    foreach (var unselectedApple in selectableApples.Where(aa => aa.SelectedByPerson == null))
    {
        if (/*the person satisfies some conditions*/)
        {
            // This gets executed like 100 times:
            unselectedApple.SelectedByPerson = person;
        }
    }
}

foreach (var selectedApple in selectableApples.Where(aa => aa.SelectedByPerson != null))
{
    Unreachable code - the collection is empty... WTF???
}
Run Code Online (Sandbox Code Playgroud)

的SelectableApple类是没有逻辑只是一个普通的C#类,以及用于所有属性公共getter和setter.

为什么会这样?

提前致谢!

Guf*_*ffa 6

在selectedApples不包含对象的集合,它是在飞行中创建了一个集合的表达式.这意味着您对对象所做的更改将被丢弃,当您selectedApples再次循环时,将从头开始重新创建.

使用以下ToList方法将其设为集合:

var selectableApples = apples.Select(a => new SelectableApple { SelectedByPerson = null, Apple = a }).ToList();
Run Code Online (Sandbox Code Playgroud)