2013-04-03 87 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();