LINQを使った場合と使わなかった場合の比較

C#の学習を進めるとLINQという機能があることに気づきます
ここでは、LINQの仕組みを細かく理解することなく、違いを見て学ぶことにします

次の数値列のうち、50以上を抜き出してリストを作成してみましょう

2, 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);では、変数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>型のnumに整数のリストを代入し、そのリストから50以上の整数を抽出し、それらを別のList<int>型のqueryに格納し、それらを画面に出力するものです。

1行目で、List<int>型のnumに12,56,75,8,1,95,32,85,24,49という整数のリストを代入します。

4行目から10行目で、foreach文を使用し、numの中身を1つずつ取り出します。取り出した整数が50以上であれば、queryにその整数を追加します。

12行目から15行目で、queryの中身を1つずつ取り出し、画面に出力します。

解説

2つのコードを比べてみましょう
次のところの違いからどのようにコードが省略されているか分かるのではないでしょうか

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までの整数を格納しています。その後、 nums の各要素に対して2倍する操作を行う Select メソッドを呼び出し、その結果を変数 query に格納しています。

次に、 foreach 文を使って、 query の各要素を取り出し、 Console.WriteLine メソッドを使ってそれを画面に出力しています。その結果、2倍した各要素が順に表示されます。

たとえば、 nums の最初の要素は1で、2倍すると2になるため、最初に2が表示されます。次に、2倍した nums の次の要素が表示され、以下同様に続きます。

実行結果

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);
}

このコードは、List<int>型の変数numsに1から9までの整数が格納されていることを前提としています。

まず、 foreach (var n in nums) の部分では、numsに格納されている整数すべてに対して繰り返し処理を行っています。そして、その繰り返し処理の中で、queryにnumsに格納されている整数nを2倍した値を追加しています。

その後、foreach (var n in query) の部分では、queryに格納されている整数すべてに対して繰り返し処理を行っています。そして、その繰り返し処理の中で、numsに格納されている整数を2倍した値をConsole.WriteLineメソッドを使って出力しています。

つまり、このコードはnumsに格納されている整数をすべて2倍し、その結果をqueryに格納し、それをすべて出力するものです。

解説

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;
}

このコードは、整数のリスト nums を定義し、それを2倍にする匿名関数を使って新しいリストを生成し、それを表示するものです。

  1. var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; で、整数のリスト nums を定義し、それに1から9までの整数を要素として追加します。
  2. var query = nums.Select(Anonymous); で、 nums の要素を2倍する匿名関数を適用し、新しいリスト query を生成します。ここで、 Select メソッドは、リストの要素を指定した関数に適用し、新しいリストを返すものです。
  3. foreach (var n in query) で、 query の要素を一つずつ取り出し、変数 n に代入します。
  4. Console.WriteLine(n); で、取り出した要素を表示します。
  5. int Anonymous(int n) で、引数 n を2倍して返す匿名関数を定義します。この関数は、 Select メソッドによって使用されます。

最終的に、 nums の要素を2倍した値を順に表示することになります。

コード全体で見ると次のようにも考えられますね
3行目から13行目までがLINQのSelectで省略できますね

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;
}

順番は前後しますが、最初の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;
}

C#,LINQ,学習

Posted by hidepon