如何实现通用方法对不同的值类型进行数学计算

时间:2009-05-02 05:22:23

标签: c# generics

我有一个接受IEnumerable-decimals和性能各种数学函数的方法。我想在IEnumerable-int-上使用相同的方法。我该如何实现?比如找一个简单的总和?

void Calculate<T>(IEnumerable <T> ListOFNumbers)
{
   int count= ListofNumbers.Count();
   ?sum=?;
}

4 个答案:

答案 0 :(得分:3)

MiscUtil全部免费提供。 Operator类提供对泛型算术的访问;并且存在SumAverage等的通用实现(作为扩展方法) - 除了基元之外,还使用合适的运算符与任何类型一起使用。例如,您可以使用Sum Complex<T>等等。

请注意,它目前使用的是.NET 3.5;我确实在某个地方有2.0版本,但它没有经过测试......

总和的简化示例显示在usage document

public static T Sum<T>(this IEnumerable<T> source)
{
    T sum = Operator<T>.Zero;
    foreach (T value in source)
    {
        if (value != null)
        {
            sum = Operator.Add(sum, value);
        }
    }
    return sum;
}

虽然IIRC 实际的实现还有一点......

顺便说一句,请注意dynamic(在.NET 4.0 / C#4.0中)应该支持运营商,但我们必须等待测试版才能看到它的作用。从我之前在CTP中查看dynamic开始,我期望它比MiscUtil代码慢一点,但我们会看到。

答案 1 :(得分:0)

您可以使用IEnumerable.Sum功能

答案 2 :(得分:0)

这纯粹是在反射器中寻找和跳跃。


{
   IQueryable qt = ListofNumbers.AsQueryable();
   Console.WriteLine(qt.Sum());
}

答案 3 :(得分:0)

您可以使用内置的LINQ Aggregate(...)方法执行此操作以及许多其他更复杂的计算,即

int[] n = new int[] { 1, 2, 3, 4, 4, 5, 5, 6 };
int sum = n.Aggregate((x, y) => x + y);

执行lamdba时,对于枚举中的每个元素,x,y的值为

0,1
1,2
3,3
6,4,
10,4,
14,5,
19,5
24,6
分别为

,最终结果为30

使用此功能,您可以使用任何所需的聚合功能:

例如:

int[] n = new int[] { 1, 2, 3, 4, 4, 5, 5, 6 };
int count = n.Aggregate((x, y) => x + 1);

为了简化这一点,有一些常用聚合的内置函数,如Count和Max。 希望这有帮助

亚历