【问题标题】:foreach loop with a where clause带有 where 子句的 foreach 循环
【发布时间】:2014-10-14 06:00:14
【问题描述】:

我想知道是否可以使用 where 循环在 C# 中创建一个 foreach 循环。里面不是 if 语句,而是循环声明中的 where 子句。

也许是这样的?

foreach(var n in people where n.sex == male)
{
}

【问题讨论】:

标签: c# .net foreach


【解决方案1】:

是的,有可能:

方法语法:

foreach (var person in people.Where(n => n.sex == "male"))
{
}

或者是相当冗长的查询语法:

foreach (var person in from person in people where person.sex == "male" select person) 

【讨论】:

  • 假设这是使用 LINQ 还是 Lambda 函数?
  • 或者使用 Linq 语法:foreach (var person in from i in people where i.sex == "male" select i) { ... }(不是说这更好,只是将其列为一种可能性。)
  • @Scott 是的。我的评论中的代码和这个答案中的代码都编译成同一个东西。
  • 这是使用Enumerable.Where。您的代码将编译为与我在答案中发布的完全相同的语句
  • @cdhowie 它被称为 查询语法,而不是 LINQ 语法。两种语法都是使用 LINQ 的不同方式。
【解决方案2】:

看起来您需要一个 lambda 表达式来限制 foreach 外观使用的项目。

根据您的有限示例,如下所示:

foreach(var n in people.Where(n => n.sex == male))
{
}

【讨论】:

    【解决方案3】:

    正如 Yuval 的回答及其 cmets 所指出的,您可以将任何查询(以“流利”或“查询语法”形式)作为集合表达式。这会导致尴尬的结构,例如:

    foreach(var person in from person in people where person.sex == male select person) 
    

    这不仅非常冗长,在我在这里给出的示例中,简单的名称person 用于查询和循环声明。您可能想知道为什么这甚至是合法的,因为通常 C# 严格确保简单名称在给定的局部变量范围内只有一种含义。答案就在这里:http://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/

    IIRC C# 设计团队曾简要考虑过您所描述的语法,但从未达到编写规范的程度。这是一个好主意,但它并不是一个足够出色的语言扩展,无法使其成为列表的顶部。这将是为 C# 的未来版本推销的一个不错的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2018-05-03
      • 2017-01-13
      相关资源
      最近更新 更多