2012-03-15 6 views
19

は、私は3つの値の間の最小値を見つける必要がある、と私はこのような何かをやってしまった:なぜC#のMath.Min/Max変数ではないのですか?

Math.Min(Math.Min(val1, val2), val3) 

それはちょうど私には少し愚かなようで、他の言語は、このために可変引数の関数を使用しているため。私はこれが見落としであったことを非常に疑う。

単純な最小/最大関数が可変ではない理由はありますか?パフォーマンスの影響はありますか?私が気付かなかったvariadicバージョンはありますか?

+2

あなたの探しているものではありませんが、LINQにはIEnumerableの最小拡張子があります –

+7

可変長関数を呼び出すと配列が割り当てられます。これは単純な最小/最大のためにあまりにも多くのオーバヘッドと考えられていたかもしれません。 – arx

答えて

30

それは1つが簡単に、さらに、それはあなた自身にこれらのメソッドを実装するのは簡単です

int min = new int[] {2,3,4,8}.Min(); 

System.Linqライブラリの関数を使用することができ、コレクション(IEnumerable<T>のサブクラス)の場合:

public static class Maths { 

    public static T Min<T> (params T[] vals) { 
     return vals.Min(); 
    } 
    public static T Max<T> (params T[] vals) { 
     return vals.Max(); 
    } 

} 

単純なスカラーでこのメソッドを呼び出すことができますので、Maths.Min(14,25,13,2)2となります。私は、これらの方法は、一般的に実装されていない基本的な理由を考える(...、intfloat

これらは、一般的な方法なので、数字の種類ごとに、このメソッドを実装する必要はありませんこのメソッドを配列(または少なくともIListオブジェクトを作成する必要があります。低レベルのメソッドを維持することによって、オーバーヘッドを避けることができます)ですが、私はこれらのメソッドをMathクラスに追加して、プログラマーはもっと簡単に

+0

-1この回答は質問の性質に合っていません。 –

+2

私は今それがそうだと思う、さらに多くの人々は実用的な解決策が欲しい。理論的なコンピュータサイエンスとプログラミング言語のパラダイムのための他のスタックエクスチェンジサイトがあります。 –

+1

@CommuSoft:もし彼がそれをやる方法を尋ねたなら、あなたの元の答えはうまくいくだろうが、なぜ彼は尋ねた。この質問はコンピュータサイエンスに関する一般的なものではないことは明らかです(ただし、1つに変えることはできますが...) – Guvante

8

CommuSoftはC#で同等の機能を達成する方法を扱っているので、その部分を飛ばしてください。

"なぜC#のMath.Min/Max変数ではないのですか?"という2つの考えが気になります。

まず、Math.Min(とMath.Max)はC#言語機能ではなく、.NET Frameworkライブラリ機能です。それはペタニックに見えるかもしれませんが、それは重要な違いです。実際には、C#はの2つ(またはそれ以上)の潜在的な値の間の最小値または最大値を決定するための特殊目的言語機能を提供しません。

第2に、Eric Lippert氏が指摘しているように、言語機能(おそらくフレームワーク機能)は「削除」されていないか、または積極的に除外されていない - 設計、実装、テスト、特徴。 See here for an example

.NETフレームワークの開発者ではなく、実際に発生した決定プロセスについては言い表せませんが、これは単純にインクルードレベルまで上昇しなかった古典的なケースのようですEricは提供されたリンクで「機能」を説明します。

+1

ええ、それは少しペタンティックでしたが、それは私がSOから期待しているものです。私は組み込みの言語とライブラリの機能の違いを知っています(つまり、名前空間は数学になります)。私は、.NETとMono(ほぼ同じ標準ライブラリを持つ2つの主要な実装)と言っていたはずです。まともなリンク、しかしBTW。 – tjameson

+0

@tjamesonその場合、あなたが述べているように、これは実際にはC#の質問ではないので、質問のタイトルとタグを変更したいかもしれません。ありがとう。 – JeremyDWill

+0

本当にあなたを悩ませている場合は、それを編集してください。タイトルを極端に長くしなくても.NETとMonoを含める方法は考えられません。私はそれがどのようにいいかと思います。私は、標準ライブラリに同等の機能を持たないC#の実装を認識していません。 – tjameson

2

私はCommuSoftが少なくともこれらの行に沿って何かを探している人に適しており、それが受け入れられるはずの堅牢な答えを提供していると思います。

これは、理由は間違いなく、のために必要なオーバーヘッドを避けることです。ユースケースでは、2つの値ではなくグループを比較したいと考えています。

@arxで指摘されているように、パラメトリックを使用すると、最もよく使用されるケースでは不要なオーバーヘッドになりますが、内部で使用する必要があるループに関しては不必要なオーバーヘッドになります配列n - 1回。

の基本フォームに加えて、というメソッドを作成したことの引数は簡単に参照できますが、LINQは必要なくなりました。

関連する問題