【问题标题】:Can I Create a Generic Method for Sum In C# [duplicate]我可以在 C# 中创建 Sum 的通用方法吗?
【发布时间】:2013-01-27 05:43:12
【问题描述】:

可能重复:
Generics - where T is a number?

我已经为最大值创建了一个通用方法,我使用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;
    }

【问题讨论】:

  • @mikez 不,当然。仔细看看。

标签: c# generics


【解决方案1】:

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

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

【讨论】:

  • 唯一要添加的是您必须添加“使用 System.Linq;”在您的班级中名列前茅。
  • 请注意,LINQ 为不同类型提供了多个 Sum 重载。如果您有一个 IEnumerable 并且不知道 T(因为该方法是通用的),那么您不能使用此方法。
  • 但是在这里你会如何描述复杂对象的行为呢?
【解决方案2】:

不,您不能为所有类型创建一种通用方法。但是对于某些类型,您可以使用LINQ 扩展方法Sumdecimaldoubleintlong,... 在此处查看更多类型: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);
}

在此处查看更多信息:Making generics add up

【讨论】:

    【解决方案3】:

    我假设你想像这样编写一个通用方法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 和 IEquatable。这些都没有提供允许您实现Sum 方法的Add 方法(或+ 运算符)。并且您不能将接口实现添加到现有类型。

    您可以做的是将一个对象传递给知道如何添加两个泛型类型的值的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; }
    }
    

    【讨论】:

    • 你的解决方案有潜在的错误 - 没有零状态的类会计算错误,实现必须是丑陋的,有开关条件
    • if (values.Count == 0) throw new ArgumentException(); var 结果 = values.GetValue(); for (var i = 1; i
    猜你喜欢
    • 2022-09-27
    • 2011-07-24
    • 1970-01-01
    • 2017-03-09
    • 2019-07-17
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多