LINQ:数値コレクション内の数値を集計するには?[C#、VB]:.NET TIPS
コレクションに格納されている数値を集計するにはループを記述するのが一般的だ。しかし、LINQを使うことで、メソッドを1つ呼び出すだけで集計できる。本稿ではこの方法を解説する。
対象:.NET 3.5以降
配列やコレクションに格納されている数値を集計する処理はよくあるだろう。ループを書いてその中で加算していけばよいのだが、もっと簡潔に書けたらよいのにと思ったことはないだろうか? LINQを使えばそれが可能だ。本稿ではその方法を説明する。
従来の書き方
例えば1から10までの整数が格納されたコレクションがあるとき、今までならその数値を合計するために次のコードのようなループを書いていただろう。
var nums = System.Linq.Enumerable.Range(1, 10); // 1〜10の整数を格納したコレクション
var sum = 0;
foreach (var n in nums)
sum += n;
Console.WriteLine(sum); // →55
Dim nums = System.Linq.Enumerable.Range(1, 10) ' 1〜10の整数を格納したコレクション
Dim sum = 0
For Each n In nums
sum += n
Next
Console.WriteLine(sum) ' →55
ここで使っているEnumerableクラス(System.Linq名前空間)のRangeメソッドは、引数に指定した範囲の整数シーケンスを生成してくれる(第1引数は開始数、第2引数は生成数)。コレクションのインスタンスを作成し、そこに1から10までの整数を追加することと同じである。
LINQで数値を集計する
LINQは、ループを書かずにループ処理を行う仕組みでもある。LINQとはデータベースにアクセスしたり、データに対してクエリを実行したりするためのものだという印象が強いかもしれないが、それだけではないのだ。
System.Linq名前空間のEnumerableクラスには、数値を合計するためのSum拡張メソッドが用意されている*1。これを使うと、数値を合計するコードは次のように書ける。
var nums = Enumerable.Range(1, 10); // 1〜10の整数を格納したコレクション
var sum = nums.Sum(); // コレクション内の数値を全部合計する
Console.WriteLine(sum); // →55
Dim nums = Enumerable.Range(1, 10) ' 1〜10の整数を格納したコレクション
Dim sum = nums.Sum() ' コレクション内の数値を全部合計する
Console.WriteLine(sum) ' →55
この他に、Enumerableクラスの拡張メソッドを使用するため、System.Linq名前空間のインポートが必要だ。
このように、ループ処理が簡潔に1行で書けるのである。これはほんの一例であって、LINQを使ってループを書かずに済ませられる場面は多い。
*1 Enumerableクラスにはこの他に、平均を求めるAverage拡張メソッドや、最小値/最大値を求めるMin拡張メソッド/Max拡張メソッドなどがある。
利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラスライブラリ 処理対象:LINQ
使用ライブラリ:Enumerableクラス(System.Linq名前空間)
Copyright© Digital Advantage Corp. All Rights Reserved.