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.
为什么会这样?
提前致谢!
在selectedApples不包含对象的集合,它是在飞行中创建了一个集合的表达式.这意味着您对对象所做的更改将被丢弃,当您selectedApples再次循环时,将从头开始重新创建.
使用以下ToList方法将其设为集合:
var selectableApples = apples.Select(a => new SelectableApple { SelectedByPerson = null, Apple = a }).ToList();
Run Code Online (Sandbox Code Playgroud)