LINQ:数値コレクション内の数値を集計するには?[C#、VB].NET TIPS

コレクションに格納されている数値を集計するにはループを記述するのが一般的だ。しかし、LINQを使うことで、メソッドを1つ呼び出すだけで集計できる。本稿ではこの方法を解説する。

» 2014年08月28日 16時34分 公開
.NET TIPS
Insider.NET

 

「.NET TIPS」のインデックス

連載目次

対象:.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

ループで数値を集計するコード例(上:C#、下:VB)
ここで使っている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

LINQで数値を集計するコード例(上:C#、下:VB)
この他に、Enumerableクラスの拡張メソッドを使用するため、System.Linq名前空間のインポートが必要だ。

 このように、ループ処理が簡潔に1行で書けるのである。これはほんの一例であって、LINQを使ってループを書かずに済ませられる場面は多い。

*1 Enumerableクラスにはこの他に、平均を求めるAverage拡張メソッドや、最小値/最大値を求めるMin拡張メソッドMax拡張メソッドなどがある。


利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラスライブラリ 処理対象:LINQ
使用ライブラリ:Enumerableクラス(System.Linq名前空間)


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。