Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Enumerable.Where()
シーケンス(配列やコレクション)から条件に一致する要素だけを抽出する LINQ の拡張メソッドです。
構文
using System.Linq; // ラムダ式で条件を指定して要素を絞り込みます。 IEnumerable<T> result = source.Where(x => 条件式); // インデックス付きオーバーロード(要素と位置の両方が使えます) IEnumerable<T> result = source.Where((x, i) => 条件式);
メソッド一覧
| メソッド | 概要 |
|---|---|
| Where(predicate) | 条件に一致する要素のみを返す遅延評価のシーケンスを返します。 |
| Where((x, i) => ...) | 要素とそのインデックスを使った条件で絞り込みます。 |
| OfType<T>() | 指定した型に変換できる要素だけを抽出します。 |
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 偶数だけを抽出します。
IEnumerable<int> evens = numbers.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens)); // 2, 4, 6, 8, 10
// 5 より大きい要素を抽出します。
IEnumerable<int> bigOnes = numbers.Where(n => n > 5);
Console.WriteLine(string.Join(", ", bigOnes)); // 6, 7, 8, 9, 10
// 複数条件を組み合わせます(偶数かつ 5 より大きい)。
IEnumerable<int> filtered = numbers.Where(n => n % 2 == 0 && n > 5);
Console.WriteLine(string.Join(", ", filtered)); // 6, 8, 10
// 文字列リストから特定の条件で絞り込みます。
List<string> fruits = new List<string> { "apple", "banana", "cherry", "apricot" };
IEnumerable<string> aFruits = fruits.Where(f => f.StartsWith("a"));
Console.WriteLine(string.Join(", ", aFruits)); // apple, apricot
// インデックス付きオーバーロードで偶数インデックスの要素だけ取得します。
IEnumerable<int> evenIdx = numbers.Where((n, i) => i % 2 == 0);
Console.WriteLine(string.Join(", ", evenIdx)); // 1, 3, 5, 7, 9
// クエリ構文(SQL ライク)でも同じことができます。
IEnumerable<int> query = from n in numbers
where n % 2 == 0
select n;
Console.WriteLine(string.Join(", ", query)); // 2, 4, 6, 8, 10
概要
『Where()』は遅延評価(Lazy Evaluation)で動作するため、メソッドを呼び出した時点ではシーケンスが実体化されません。『ToList()』や『foreach』など実際に列挙が行われたときに初めて処理が走ります。
『Where()』はフィルタリングのみを行い、元のシーケンスは変更されません。抽出した結果をリストとして使いたい場合は『ToList()』に続けて呼び出してください。
複数の条件を組み合わせるときは『Where()』を連鎖(チェーン)させることもできます。要素を変換しながら絞り込みたい場合は『Enumerable.Select()』と組み合わせて使うのが一般的です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。