使用where子句的foreach循环

39

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

像这样的东西可能可以吗?

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

4
为什么不使用方法语法 foreach(var n in people.Where(p=>p.sex == male)) 呢? - Vojtěch Dohnal
2
不是重复但相关:https://dev59.com/aGox5IYBdhLWcg3wpFz5 - Habib
3个回答

69

是的,这是可能的:

方法语法:

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

或者相对冗长的查询语法:

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

3
假设这是使用LINQ还是Lambda函数? - Scott
2
或者使用 Linq 语法:foreach (var person in from i in people where i.sex == "male" select i) { ... }(并不是说这种方式更好,只是列举一种可能性。) - cdhowie
4
是的,我的评论中的代码和这个答案中的代码编译成的结果是一样的。 - cdhowie
2
这是使用Enumerable.Where。你的代码将编译成与我在答案中发布的完全相同的语句。 - Yuval Itzchakov
2
@cdhowie 它被称为“查询语法”,而不是LINQ语法。这两种语法都是使用LINQ的不同方式。 - Servy
显示剩余2条评论

6

正如Yuval的回答及其评论所指出的那样,您可以将任何查询(无论是“流畅”还是“查询语法”形式)放在集合表达式中。这会导致尴尬的结构,比如:

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/ 据我所知,C#设计团队曾经考虑过您描述的语法,但甚至没有写规范。这是一个不错的想法,但它并不足以成为最重要的语言扩展之一。这将是一个很好的功能,可以在未来的C#版本中推广。

6

看起来你需要一个lambda表达式来限制foreach循环处理的项。

根据你提供的有限示例,可以像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接