【LINQのメソッド紹介その3】Whereで条件に合うデータを取得する
LINQにおいて、Selectメソッドは繰り返し処理のコードをきれいに書けるということを説明しました。Whereメソッドを併用することで、条件分岐をさせることが可能になります。これによりSelectの次にWhereを使用することで条件を絞ることができます。
- プログラマー
- WhereメソッドでSelectメソッドの条件を付けることができるんですね。
- プロジェクト
マネージャー - そうです。これでSelectメソッドがより便利になりますよ。早速使い方を見ていきましょう。
Whereメソッドでできること
Whereメソッドは、コレクションクラス(いわゆる配列)を走査する際のフィルタリングをすることが出来ます。これにより、Selectメソッドと組み合わせることで特定の条件を満たす要素に対する処理を行うことが可能です。
Selectメソッドと同じく使用する機会が多い汎用メソッドなので、LINQを使いこなす上ではマスターしておきたいメソッドの一つです。
Whereメソッドのサンプルコード
Whereメソッドのコーディング例を紹介していきます。ここではSelectメソッドのコーディング例になりますが、他の併用可能なメソッドでも記述は同様です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
using System.Linq;
namespace Test1
{
class Test1
{
static void Main()
{
int[] test_data = {5, 8, 7, 9, 6, 2};
var test_query = test_data
.Where(x => x > 5)
.Select(x => x * x);
Console.WriteLine("{0}", string.Join(", ", test_query));
}
}
}
|
実行結果
1
|
64, 49, 81, 36
|
このコードでは、Whereメソッドで対象となる要素(ここでは5より上の数値)に対してSelectメソッドで平方数(x*x)として出力しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
using System.Linq;
namespace Test2
{
class Test2
{
static void Main()
{
int[] test_data = {2, 8, 3, 5, 7, 1};
var test_query = test_data
.Where(x => x > 4 && x < 8)
.Select(x => x - 3);
Console.WriteLine("{0}", string.Join(", ", test_query));
}
}
}
|
実行結果
1
|
2, 4
|
このコードでは、指定した複数の条件を満たすコレクション要素に対して、Selectメソッドで処理を行っています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
using System.Linq;
namespace Test3
{
class Test3
{
static void Main()
{
int[] test_data = {0, 4, 5, 2, 7, 6};
var test_query = test_data
.Where(x => x < 3 || x > 6)
.Select(x => x * 1.1);
Console.WriteLine("{0}", string.Join(", ", test_query));
}
}
}
|
実行結果
1
|
0, 2.2, 7.7
|
このコードでは、指定した条件のうち、どちらかを満たす要素に対してSelectメソッドで処理を行っています。
Whereメソッドは省略できる
Whereメソッドは使用頻度が高い汎用メソッドですが、Whereメソッドを使わなくても条件付けができる例も存在します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
using System.Linq;
namespace Test4
{
class Test4
{
static void Main()
{
int[] test_data = {0, 4, 5, 2, 7, 6};
var test_query = test_data
.Where(x => x < 3 || x > 6)
.Count();
Console.WriteLine("{0}", test_query);
}
}
}
|
実行結果
1
|
3
|
複数の条件のうち、どちらかを満たす場合において、その数を数えるCountメソッドを使用する場合です。こちらは正常に動作しており問題ありませんが、Countメソッドにおいて条件指定することができるので、以下のように書き換えることができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
using System;
using System.Linq;
namespace Test4
{
class Test4
{
static void Main()
{
int[] test_data = {0, 4, 5, 2, 7, 6};
var test_query = test_data
.Count(x => x < 3 || x > 6); // Countメソッドに直接条件を指定出来る
Console.WriteLine("{0}", test_query);
}
}
}
|
実行結果
1
|
3
|
このように、メソッドの引数として直接フィルター条件を入れられるメソッドに対しては、Whereメソッドを使う必要はありません。
- プログラマー
- Whereメソッドのおかげでコレクションクラスの扱いやすさが段違いですね。
- プロジェクト
マネージャー - そうですね。でも汎用性が高い反面、例に挙げた通り使わなくてもいいパターンも知っておくのが良いでしょう。
Whereメソッドは便利な反面無駄もできやすい
Whereメソッドはとても便利で使いやすいため、LINQを使いこなすために覚えておきたいものです。ただし、無駄なコーディング(動作上は問題なし)になってしまうこともしばしばあるため、本当の意味で使いこなすためには少しでもメソッドの性質を理解し、コーディングを行う必要があります。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)