web-dev-qa-db-ja.com

where句を含むforeachループ

Whereループを使用してC#にforeachループを作成できるかどうか疑問に思っていました。内部にifステートメントがありませんが、ループの宣言にand句があります。

たぶんこんな感じ?

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

はい、可能です:

メソッドの構文:

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

または、かなり長いクエリ構文:

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

必要なのは、foreachルックが機能するアイテムを制限するラムダ式のようです。

あなたの限られた例に基づいて、このようなもの:

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

Yuvalの回答とそのコメントが指摘しているように、「式」形式のクエリをコレクション式として使用できます。これは、次のような厄介な構造につながります。

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

これは非常に冗長であるだけでなく、ここで示した例では、クエリとループ宣言の両方でpersonという単純な名前が使用されています。通常、C#は特定のローカル変数スコープで単純な名前の意味が1つだけであることを保証するので、なぜそれが合法なのか疑問に思うかもしれません。答えはこちら: http://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/

IIRC C#設計チームは、あなたが説明したような構文を簡単に検討しましたが、仕様を作成することさえありませんでした。それは素晴らしいアイデアですが、それはリストの一番上にそれを作るのに十分に素晴らしい言語拡張ではありませんでした。これは、C#の将来のバージョンのために売り込む素晴らしい機能です。

5
Eric Lippert