【问题标题】:Why foreach loop works but Linq variant doesn't?为什么 foreach 循环有效但 Linq 变体无效?
【发布时间】:2021-08-15 21:18:15
【问题描述】:

我想用枚举值填充 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);
}

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

【问题讨论】:

  • Linq 版本有问题:Select 方法进行投影以创建项目集合,但在这里您只是调用了一个返回索引的方法......所以,为什么不呢?否则你不会execute the query,因此什么都不做,除非你调用 ToList。就个人而言,我发现这样的代码深奥,不干净,要避免,而且效率不高,因此危险

标签: c# linq foreach


【解决方案1】:

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?

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2017-09-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多