restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【メモ】LINQを用いた計算について

C#以外の言語でMapやReduceなどを利用することが多いが、C#だとLINQでできてしまうので、便利なことが多い。

普段、仕事で使っている場合はLINQ to EntityかObjectを利用することが多く、ほとんどが 「Select」「Where」で利用することが多い。

Aggregateを使うと、よりいい感じにできるみたいなので、自分の整理のためにメモしておく。

learn.microsoft.com

まあ、MSのサイトにこう書いてあるのだが、例えが自分にはわかりにくかったので・・・

例えば 配列で[ 2, 3, 4, 5, 6]というものと、初期値として10というものがあった場合、 それぞれの配列に10をかけたものの合計を求めるとする。 forとLINQそれぞれ利用したものは以下の通り。

    int[] arr = new int[] { 2, 3, 4, 5, 6 };
    int initial = 10;
    int result = 0;
/*For文*/
    for (int i = 0; i < arr.Length; i++)
    {
        result += initial * arr[i];
    }

    Console.WriteLine($"合計 : {result}");


/*LINQ*/
    var linqResult = initial * arr.Sum(x => x);
    Console.WriteLine($"合計 : {linqResult}");

これを、配列に記載の値をかけるとした場合、LINQには掛け算はないが、Aggregateを利用することで、計算結果を次の配列に使うことができる。

int[] arr = new int[] { 2, 3, 4, 5, 6 };
int initial = 10;
int result = 0;

/*For文*/
int multi = 1;
for (int i = 0; i < arr.Length; i++)
{
/*multi変数を使いまわしとなるが・・・*/
    multi *= arr[i];
}

result = initial * multi;
Console.WriteLine($"合計 : {result}");

/*LINQ*/
var linqMultiResult = arr.Aggregate(initial, (sum, next) => sum * next);
Console.WriteLine($"合計 : {linqMultiResult}");

Aggregateを活用すると、初期値、(設定する値、配列の値) => 計算式 とすることで、初期値の値から、次の添え字の結果、その結果をまたその次の添え字の結果として、計算ができる。 パット見ると慣れない記述となるが、for文であれこれ考えるより、1行でスパッとできるので、いい感じ。

欠点ではないが、極力、指定する数値の型は合わせる方がよさそう。intとdoubleとか異なる型だとコンパイルエラーになります。

ただ、自分が日ごろ管理しているビジネスアプリだとあんまり使わないかな?(会計処理だと使えるかもです)