问题描述
我想用枚举值填充 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 查询某些东西而不是修改(添加)某些东西。