C# IEnumerable延拓法计算其项之和

C# IEnumerable延拓法计算其项之和,c#,ienumerable,extension-methods,C#,Ienumerable,Extension Methods,我想为IEnumerable创建一个扩展方法,用于计算其项的总和并返回总值。只有当类型T是数字类型double、float、int。。。如果IEnumerable是列表、集合或字典,那么这个总和必须不同 我创建此方法的尝试如下所示: public static class IEnumerableTExtensoes { public static double Sum<T>(this IEnumerable<T> IEnum) { bool

我想为IEnumerable创建一个扩展方法,用于计算其项的总和并返回总值。只有当类型T是数字类型double、float、int。。。如果IEnumerable是列表、集合或字典,那么这个总和必须不同

我创建此方法的尝试如下所示:

public static class IEnumerableTExtensoes
{
   public static double Sum<T>(this IEnumerable<T> IEnum)
    {
        bool isInt = typeof(T) == typeof(int);
        bool isFloat = typeof(T) == typeof(float);
        bool isDouble = typeof(T) == typeof(double);

        if(isInt || isFloat || isDouble)
        {
            T sum = (double)0;
            foreach(T num in IEnum)
            {
                sum += num;
            }
        }
        return sum;
    }
}
这根本不起作用


有什么建议吗?

让我猜猜:这不起作用,因为T没有定义运算符+

我可以想出两种方法来解决这个问题,但我无法测试其中任何一种,因此我无法保证它们中的每一种是否都有效,或者是否由于我现在缺少的一些细节而无法实现

一种方法是声明3种不同的方法:

公共静态双sum此IEnumerable ienum

公共静态双Sumthis IEnumerable ienum,和

公共静态双Sumthis IEnumerable ienum


另一种方法是利用所有3种感兴趣的类型都实现IConvertible接口这一事实。所以,你会用where T:I声明Sum方法,然后在循环中,你会把每个值转换成一个已知的公分母,比如说Double,这样你就可以进行求和了,最后你会不知何故,我不确定,也许会用cast?将其转换回T类型,以便返回。

为什么不使用LINQ Sum?也就是说,根本不工作不是一个非常具体的问题。请告诉我们您的问题的具体症状。这根本不起作用,根本不是问题描述。请告诉我们这种方法的目的是什么,以及为什么您不能使用内置的求和扩展方法。我不明白。如果我们为您编写此方法,您将如何进行练习?值得注意的是,System.Linq.Enumerable使用了多重载方法,不仅用于求和,还用于最小值、最大值和平均值