3つの値の最大値を得る方法 §
2つの値の最大値を得るにはMath.Maxメソッドを使います。
しかし、これには引数が2つしかありません。
3つの値だったらどうでしょう。
やり方は複数あります。
1つは、Math.Maxメソッドを2回使う方法です。Math.Max(a, Math.Max(b, c));と書けば可能です。
もう1つはLINQのMaxメソッドを使う方法です。しかし、それを使うには元データを列挙オブジェクトとして用意しなければなりません。そのためにサンプルソースではnew int[] { a, b, c }.Max();と書いて一時的に配列を作成しています。
もうちょっとソースを簡潔にするために、任意の個数のデータから列挙を生成するサービスメソッドcreateEnumを追加してみた事例を方法3として追加してあります。こうするとメソッドのソースはすっきりしますが、結局サービスメソッドの引数として配列を作成してしまうので効率が良くなるわけではありません。
サンプルソースに3つの方法を紹介しましたが、どの方法を使うべきかはケースバイケースです。値が本当に3つだけなら方法1でも良いですが、実は3個以上のN個ならLINQの方がベターです。
罠の数々 §
- 最小値も同じ方法で行ける。しかし、平均値は同じ方法では得られないかもしれない。3つの値の平均と、2つの値の平均ともう1つの値の平均は同じにならないかもしれないからだ。
参考リンク §
Math.Max メソッド
Enumerable.Max メソッド
Math クラス
Enumerable クラス
MathクラスとEnumerableクラスは同じ機能を持っているわけではない。たとえば、最大値と最小値を計算するメソッドはどちらにもあるが、平均値を計算するメソッドをEnumerableクラスは持っているがMathクラスが持っていない。何があって何がないのか、上記のリンクから辿って確認してみよう。
リポジトリ §
https://github.com/autumn009/cshowto
max3 §
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
private static IEnumerable<T> createEnum<T>(params T[] p) => p;
static void Main()
{
// 比較する値
int a = 1234;
int b = 999;
int c = 4949;
// 方法1 Math.Max利用
int max1 = Math.Max(a, Math.Max(b, c));
Console.WriteLine($"{a}と{b}と{c}の最大値は{max1}");
// 方法2 LINQ利用
int max2 = new int[] { a, b, c }.Max();
Console.WriteLine($"{a}と{b}と{c}の最大値は{max2}");
// 方法3 LINQ+サービスメソッド利用
int max3 = createEnum(a, b, c).Max();
Console.WriteLine($"{a}と{b}と{c}の最大値は{max3}");
}
}
実行結果
1234と999と4949の最大値は4949
1234と999と4949の最大値は4949
1234と999と4949の最大値は4949