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、その他の拡張メソッドを組み合わせることで、意図が明確なコードを書けるようになるでしょう。






ディスカッション
コメント一覧
まだ、コメントがありません