2020年10月07日
川俣晶の縁側ソフトウェアC# コーディング How To total 3965 count

【入門級】3つの値の最大値を得る方法

Written By: 川俣 晶連絡先

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

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?