LINQのMin/Max拡張メソッドを使って、簡潔なコードで数値のコレクションの中から最小値/最大値を検索する方法を解説する。
対象:.NET 3.5以降
配列やコレクションに格納されている数値から最小値/最大値を見つけ出すコードを書くのは、意外と面倒なものだ。もっと簡潔に書けたらよいのにと思ったことはないだろうか? LINQを使えばそれが可能だ。本稿ではその方法を説明する。
例えば1から10までの整数が格納されたコレクションがあるとき、その中から最小値/最大値を見つけ出すには、これまでなら次のようなループを使ったコードを書いていただろう。
var nums = System.Linq.Enumerable.Range(1, 10); // 1〜10の整数を格納したコレクション
var min = int.MaxValue;
var max = int.MinValue;
foreach (var n in nums)
{
if (min > n)
min = n;
if (max < n)
max = n;
}
Console.WriteLine("{0},{1}", min, max); // →1,10
Dim nums = System.Linq.Enumerable.Range(1, 10) ' 1〜10の整数を格納したコレクション
Dim min = Integer.MaxValue
Dim max = Integer.MinValue
For Each n In nums
If (min > n) Then
min = n
End If
If (max < n) Then
max = n
End If
Next
Console.WriteLine("{0},{1}", min, max) ' →1,10
System.Linq名前空間のEnumerableクラスには、コレクションの中から最小値を取得するMin拡張メソッドと、最大値を取得するMax拡張メソッドが用意されている。これらを使うと、最小値/最大値を取得するコードは次のようにごく簡潔に書ける。
var nums = Enumerable.Range(1, 10); // 1〜10の整数を格納したコレクション
var min = nums.Min(); // 最小値
var max = nums.Max(); // 最大値
Console.WriteLine("{0},{1}", min, max); // →1,10
Dim nums = Enumerable.Range(1, 10) ' 1〜10の整数を格納したコレクション
Dim min = nums.Min() ' 最小値
Dim max = nums.Max() ' 最大値
Console.WriteLine("{0},{1}", min, max) ' →1,10
なお、このMin拡張メソッド/Max拡張メソッドにはnull許容型(Nullable型)を受け取るオーバーロードも用意されているので、コレクションにnull/Nothingが含まれていても問題ない。null/Nothingを除外して、最小値/最大値を見つけ出してくれる。
利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラスライブラリ 処理対象:LINQ
使用ライブラリ:Enumerableクラス(System.Linq名前空間)
関連TIPS:[LINQ]数値コレクション内の数値を集計するには?[.NET3.5、C#、VB]
Copyright© Digital Advantage Corp. All Rights Reserved.