我想知道是否可以在C#
中使用where循环创建foreach循环。不在内部使用if语句,而是在声明循环中使用where子句。
也许是这样的?
foreach(var n in people where n.sex == male)
{
}
答案 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#的未来版本而言,这将是一个很好的功能。