LINQを使った場合と使わなかった場合の比較
C# の学習を進めると「LINQ」という機能があることに気づきます。
ここでは、LINQ の仕組みを細かく理解せずに、コードの違いを見比べることで学んでみましょう。
例:数値から 50 以上を抽出する
次の数値列のうち、50以上のものだけを抜き出し、新しいリストを作成してみます。
12, 56, 75, 8, 1, 95, 32, 85, 24, 49
Where メソッド(要素をフィルタリングして別のデータ群にする)
LINQ を使って導き出した場合
var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
var query = nums.Where(n => n >= 50);
foreach (var n in query)
{
Console.WriteLine(n);
}
このコードは、List<int>
型の変数 nums
に整数が格納されているとして、その中から 50 以上の数値を取り出して表示するプログラムです。
var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
List<int>
型の変数nums
を定義し、12・56・75・8・1・95・32・85・24・49 を要素として格納しています。
var query = nums.Where(n => n >= 50);
nums
から 50 以上の数値を取り出し、変数query
に格納しています。Where
メソッドは、指定した条件(ここではn >= 50
)を満たす要素のみを抽出するメソッドです。
foreach (var n in query)
query
に格納された要素を順番に取り出し、変数n
に代入します。
Console.WriteLine(n);
- 取り出した数値を改行しながら表示します。
実行結果
56
75
95
85
LINQ を使わなかった場合
List<int> nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
List<int> query = new List<int>();
foreach (var n in nums)
{
if (n >= 50)
{
query.Add(n);
}
}
foreach (var n in query)
{
Console.WriteLine(n);
}
このコードは、List<int>
型の nums
に整数リストを代入し、それを使って 50 以上の整数を抽出するものです。
List<int> nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
nums
に整数のリストを格納しています。
foreach (var n in nums)
~if (n >= 50)
nums
の要素を 1 つずつ取り出し、50 以上であればquery
に追加しています。
foreach (var n in query)
query
に格納された要素を 1 つずつ取り出して表示しています。
解説
2 つのコードを比べると、LINQ を使わない場合は

- ループを回して条件をチェックし、
- 条件を満たす要素をリストに追加し、
- さらにそれをループで出力する、
といった手順が必要になります。
一方、LINQ を使う場合は Where
を呼び出すだけで 50 以上を抽出できるため、コードが簡潔になり、「何をしたいか」が明確に表現されます。
Select メソッド(各要素を加工して別のデータ群にする)
LINQ を使って導き出した場合
var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = nums.Select(n => n * 2);
foreach (var n in query)
{
Console.WriteLine(n);
}
このコードは、nums
に 1 ~ 9 の整数を格納し、その各要素を 2 倍に変換する操作を Select
メソッドで行っています。query
に格納された要素を foreach
で取り出し、画面に出力することで、2 倍した結果が表示されます。
実行結果
2
4
6
8
10
12
14
16
18
LINQ を使わなかった場合
List<int> nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> query = new List<int>();
foreach (var n in nums)
{
query.Add(n * 2);
}
foreach (var n in query)
{
Console.WriteLine(n);
}
foreach (var n in nums)
nums
の要素を 1 つずつ取り出し、2 倍した値をquery
に追加します。
foreach (var n in query)
query
に格納された値を 1 つずつ取り出して出力します。
解説

こちらも、LINQ を使わない場合はループを 2 回書いていますが、LINQ を使うと Select
一発で済みます。
処理を「2 倍する」という意図がコードに直接表現されるため、可読性が高まります。
もう少し正確な置換
var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = nums.Select(Anonymous);
foreach (var n in query)
{
Console.WriteLine(n);
}
int Anonymous(int n)
{
return n * 2;
}
Select
メソッドは、要素を 2 倍する関数(ここではAnonymous
)を適用して新しいリストを生成し、query
に格納します。- その後、
query
の要素を取り出して順に表示します。
「匿名関数」と呼ばれるラムダ式を直接書く代わりに、ここではわざと名前付きのメソッド Anonymous
を使って表現しています。
実際には Select(n => n * 2)
のように短く書くことが多いでしょう。
コード全体で見ると
var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = new List<int>();
foreach (var n in nums)
{
query.Add(Anonymous(n));
}
int Anonymous(int n)
{
return n * 2;
}
このように書かれている処理を LINQ の Select
で省略できる、という見方もできます。
コード
Where を同じように書くと
var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
var query = new List<int>();
foreach (var n in nums)
{
if (Anonymous(n))
{
query.Add(n);
}
}
bool Anonymous(int n)
{
return n >= 50;
}
この処理(要素を条件で絞り込み、リストに追加する部分)を LINQ の Where
に置き換えることで、ループや条件分岐を簡潔にまとめられます。
以上のように、LINQ を使わない場合はループと条件分岐(または加工処理)を自前で書く必要がありますが、LINQ を使うと一行の記述で済むことが多くなり、コードが読みやすく保守しやすくなります。慣れてくると、より複雑な処理でも Where
や Select
、その他の拡張メソッドを組み合わせることで、意図が明確なコードを書けるようになるでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません