【问题标题】:How to use generic to create common method for addition for multiple data types?如何使用泛型创建用于添加多种数据类型的通用方法?
【发布时间】:2012-03-13 09:42:18
【问题描述】:

我应该写一个方法,它将对整数、浮点数或双精度数的集合执行加法。我打算写一个三个方法,它将遍历三种不同的类型执行加法并返回值。有用。我只是好奇,这是否可以在一个方法中完成,其中类型被传递一个泛型类型,类似于

public static T SUM<T>(IEnumerable<T> dataCollection)
{
T total;
foreach(var value in dataCollection)
total += value;
return total;
}

我能够通过正常的三种方法实现来解决它,但只是好奇,这有可能吗?

谢谢,

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    不能在类型为泛型类型参数的表达式上使用像+ / - / * / etc ... 这样的运算符。这些仅在处理具体类型时才有效。

    要使用泛型执行此操作,您需要传入一个抽象,该抽象了解如何对T 的实际类型执行+ 之类的操作。例如,这是一个 lambda 示例

    public static T SUM<T>(IEnumerable<T> dataCollection, Func<T, T, T> sum)
    {
      T total = default(T);
      foreach(var value in dataCollection)
        total = sum(total, value);
      return total;
    }
    
    List<int> list = ...;
    list.Sum((left, right) -> left + right);
    

    注意:正如一些人指出的那样,我在这里编写的函数与System.Linq.Enumerable.Aggregate 基本相同。请使用它而不是把它放在你的代码中。

    【讨论】:

    • 当然,这只不过是一个滚动你自己的 Aggregate() 函数,因为传递的 lambda 可以是从左到右到左/右的任何东西。
    • @Nair,请注意这个功能已经存在Enumerable.Aggregate,请尝试使用它,除非你这样做是为了学习。
    • 是的,这是学习经验的一部分,我也不知道 Aggregate。
    • @JaredPar 在上述方法中,sum(total, value) 编译器对未分配的总数进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2017-01-21
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多