web-dev-qa-db-fra.com

boucle foreach avec une clause where

Je me demandais s'il était possible de créer une boucle foreach dans C# avec une boucle where. Pas avec une instruction if à l'intérieur, mais une clause where dans la déclaration de la boucle.

Peut-être quelque chose comme ça?

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

Oui c'est possible:

Syntaxe de la méthode:

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

Ou la syntaxe de requête assez longue:

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

Il semble que vous ayez besoin d'une expression lambda pour limiter les éléments avec lesquels le look foreach fonctionne.

Sur la base de votre exemple limité, quelque chose comme ceci:

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

Comme le soulignent la réponse et les commentaires de Yuval, vous pouvez placer n'importe quelle requête - sous la forme "fluide" ou "syntaxe de requête" - comme expression de collection. Cela conduit à des constructions maladroites comme:

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

Non seulement cela est très verbeux, dans l'exemple que j'ai donné ici, le simple nom person est utilisé à la fois dans la requête et la déclaration de boucle. Vous vous demandez peut-être pourquoi cela est même légal, car normalement C # est strict pour garantir qu'un nom simple n'a qu'une seule signification dans une portée de variable locale donnée. La réponse est ici: http://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/

L'IIRC, l'équipe de conception C # a brièvement examiné une syntaxe telle que vous la décrivez, mais n'a jamais réussi à rédiger une spécification. C'est une bonne idée mais ce n'était tout simplement pas une extension de langue suffisamment impressionnante pour arriver en tête de liste. Ce serait une fonctionnalité intéressante à proposer pour une future version de C #.

5
Eric Lippert