2012-03-25 15 views
3

パラメータのセットの最大値を与える汎用関数を定義しようとしています。それはこのように書きます:部分的順序付けのためのIComparable型インターフェイス

public static TResult Max<TResult>(params TResult[] items) 
    { 
     TResult result = items[0]; 
     foreach (var item in items) 
     { 
      if (item > result) 
       result = item; 
     } 
     return result; 
    } 

これは、コンパイラは「item>の結果」の行にcroaksことを除いて、すべてが順調と良いです。私が必要とするのは、TResultに>演算子(または<も同様に)を強制する方法です。しかし、これを行うための簡単に利用可能なインターフェースはありません。これは部分的に順序付けされているので、かなり一般的な作業のようです。巨大な.NETのドキュメントで何か不足していますか?

+5

合計発注(つまり、「IComparable」)がここで適切でないのはなぜですか? –

+0

linqを使用できますか? –

答えて

5

あなたはIComparableを使用することができます。

public static IComparable Max<TResult>(params IComparable[] items) 
{ 
    IComparable result = items[0]; 
    foreach (var item in items) 
    { 
     if (item.CompareTo(result) > 0) 
      result = item; 
    } 
    return result; 
} 
+1

OPは 'IComparable'を使いたくないようです。なぜか分からないのは面白いでしょう... –

+0

@Konrad Rudolph:そうですね、私はタイトルからもう一度読みました。 – Tudor

+2

いいえ、OPはドキュメントを正しく読まなかったばかげたお尻です。 @ Tudorは私が両方のおかげで欲しいものを正確に持っています。 –

2

ちょうど半順序をsuppport何のインタフェースがありません。ジェネリックで演算子を使用することもできません。

最も一般的なソリューションパスコンパレータメソッドの代理人。

IComparableまたはIComparerの部分だけを使用して、 "これはそれ以上です"と書かれ、他の2つの値は無視されます。

IComparableおよび IComparer<in T> LINQクエリによって使用されます。私。 OrderByを参照してください。

関連する問題