7

可能重复:
泛型 - 其中 T 是一个数字?

我已经为最大值创建了一个通用方法,并且我使用了IComparable接口

有人知道如何为 Sum 创建通用方法吗?该方法中哪个接口有用?

这是我的 GetMax 代码:

public static T GetMax<T>(T[] array) where T : IComparable
    {
        T min = array[0];

        foreach (T item in array)
        {
            if (min.CompareTo(item) < 0)
            {
                min = item;
            }
        }
        return min;
    }
4

3 回答 3

8

此操作已存在Linq.Sum()

var sum = new List<int>{1,2,3}.Sum();
于 2013-01-26T21:24:08.313 回答
3

不,您不能为所有类型创建一种通用方法。但是您可以对某些类型使用LINQ扩展方法: , , , , ... 在此处查看更多类型:Enumerable.SumSumdecimaldoubleintlong

int[] array1 = { 1, 3, 5, 7 };
int sum1 = array1.Sum();

对于您自己的类型,您可以创建和实现接口ISummable

interface ISummable<T>
{
   T Add(T a, T b);
}

然后你的通用方法将类似于这个:

T Sum<T>(T a, T b) where T:ISummable<T>
{
    return a.Add(a,b);
}

在此处查看更多信息:使泛型相加

于 2013-01-26T21:30:01.403 回答
1

我假设您想编写这样的通用方法Sum

static T Sum<T>(this IEnumerable<T> values) where T : ??
{
    T result = 0;
    foreach (var value in values)
    {
        result = result + value;
    }
    return result;
}

不幸的是,没有任何约束可以代替??来完成这项工作。

.NET 中内置的数据类型实现了某些接口。例如,int实现 IComparable、IFormattable、IConvertible、IComparable<int> 和 IEquatable<int>。这些都没有提供允许您实现方法的Add方法(或运算符) 。而且您不能将接口实现添加到现有类型。+Sum

您可以做的是将一个对象传递给Sum知道如何添加两个泛型类型值的方法:

static T Sum<T>(this IEnumerable<T> values, IAdder<T> adder)
{
    T result = adder.Zero;
    foreach (var value in values)
    {
        result = adder.Add(result, value);
    }
    return result;
}

interface IAdder<T>
{
    T Zero { get; }

    T Add(T a, T b);
}

class Int32Adder : IAdder<Int32>
{
    public static readonly Instance = new Int32Adder();

    public int Zero { get { return 0; } }

    public int Add(int a, int b) { return a + b; }
}
于 2013-01-26T21:24:56.280 回答