为什么 foreach 循环有效但 Linq 变体无效?

问题描述

我想用枚举值填充 WinForms ComboBox,但是当我尝试使用 Linq 执行此操作时,ComboBox 中没有添加任何项目。但是,foreach 变体工作得很好。

我的 Linq:

Enum.GetNames(typeof(AgeCategory))
    .Select(x => cbCategory.Items.Add(x));

我的 foreach:

foreach (var category in Enum.GetNames(typeof(AgeCategory)))
{
    cbCategory.Items.Add(category);
}

此外,如果您知道更好的方法来做到这一点,我愿意接受不同的解决方案。

解决方法

Enumerable.Select 正在使用 deferred execution。这意味着如果您使用 foreach 或其他方法(如 ToList/ToArray),它会被执行。在此之前,它只会构建查询

那为什么会编译,你在那里做什么?您必须查看 ComboBox.ObjectCollection.Add 才能看到它不是 void(不返回任何内容)而是返回您添加的项目的索引。所以你在这里选择整数,这不是你想要的。

您可以使用这种方法:

cbCategory.Items.AddRange(Enum.GetNames(typeof(AgeCategory)));

作为一个经验法则:使用 LINQ 查询某些东西而不是修改(添加)某些东西。

值得一读:What are the benefits of a Deferred Execution in LINQ?