2013-04-03 89 views
3

我在C#中有一個類,我想實現方法來在泛型數組中執行操作。例如,我想從一個通用數組中獲取最大的組件值。就我而言,這將是足夠的考慮只是數值類型(int,長,雙...)使用比較的泛型

public class NumericCalculation<T> where T : IComparable<T> 
{ 
    public static T getMax (T[] array) 
    { 
     T maxValue = default(T); 
     if (array.Length > 0) { 
      maxValue = array[0];     
      for (int i = 0; i < array.Length; i++) { 
       if (array[i] > maxValue) 
       { 
        maxValue = array[i]; 
       } 
      }    
     } 
     return maxValue; 
    } 
} 

但這返回錯誤: 「錯誤2操作‘>’不能應用於操作數類型'T'和'T'「

是否有我正在跳過的界面?有可能做這種泛型數組的通用方法?

謝謝!

+0

這是C#的一個已知缺點;它是一個經常被要求的功能,能夠將泛型限制爲提供某些操作符的類型。 –

回答

9

聽起來像是你只是想:

return array.DefaultIfEmpty().Max(); 

但是,爲了回答您的具體問題,你可以使用CompareTo,這是IComparable<T>接口的成員,您已經制約數組元素類型爲:

if(array[i].CompareTo(maxValue) > 0) { ... } 

但個人而言,我會用Comparer<T>.Default,因爲它更好地處理null引用。

if(Comparer<T>.Default.Compare(array[i], maxValue) > 0) { ... } 
+0

謝謝!我打算使用比較器。默認。 – pablof

2

使用下一個代碼來比較泛型類型的對象。 CompareToIComparable<T>接口中定義

if (array[i].CompareTo(maxValue) > 0) 
{ 
    maxValue = array[i]; 
} 
2

使用CompareTo()到位comparaison運營商:因爲你只在原始數值類型(所有結構)有關這還不是全部,你的情況是很重要的。 此外,Max已經實施Linq:

return new[] {1,2,9,4,45}.Max();