带有where子句的foreach循环

时间:2014-08-20 18:42:55

标签: c# .net foreach

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

也许是这样的?

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

3 个答案:

答案 0 :(得分:51)

是的,有可能:

方法语法:

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

或相当冗长的查询语法:

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

答案 1 :(得分:6)

看起来你需要的是一个lambda表达式来限制foreach看起来适用的项目。

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

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

答案 2 :(得分:5)

正如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/

IIRC C#设计团队简要地考虑了你所描述的语法,但从未写过规范。这是一个不错的主意,但它并不是一个足够令人敬畏的语言扩展,使其成为列表的顶部。对于C#的未来版本而言,这将是一个很好的功能。