我可以在C#中创建一个通用的求和方法吗?

7

可能是重复问题:
泛型 - T 是数字?

我已经创建了一个使用 IComparable 接口的泛型方法来获取最大值。

有人知道如何创建一个用于求和的泛型方法吗?这个方法中应该使用哪个接口?

这是我的 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;
    }

@mikez 不,当然不是。仔细看看。 - Hamlet Hakobyan
3个回答

8

这个操作已经存在:Linq.Sum()

var sum = new List<int>{1,2,3}.Sum();

唯一需要补充的是,在你的类顶部添加 "using System.Linq;"。 - nerdybeardo
5
请注意,LINQ为不同类型提供了多个Sum的重载。如果您有一个IEnumerable<T>并且不知道T(因为该方法是通用的),那么就不能使用此方法。 - dtb
但是你如何描述这里复杂对象的行为? - SohamC

3
不,你不能为所有类型创建一个通用方法。但是你可以使用LINQ扩展方法Sum来处理一些类型: decimaldoubleintlong等。 在此处查看更多类型:Enumerable.Sum
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);
}

在这里查看更多信息:让泛型加起来


2
我假设你想要写一个泛型方法 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; }
}

你的解决方案可能存在漏洞 - 没有零状态的类将会计算错误,实现将不得不很丑陋,并带有 switch 条件。 - burning_LEGION
如果(values.Count == 0)则抛出新的ArgumentException异常;var result = values.GetValue();for (var i = 1; i < values.Count; i++) { result = adder.Add(result, values[i]); }返回结果;//需要在接口中添加GetValue,Linq.First()无法通过。 - burning_LEGION

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接