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

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

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

这在MiscUtil中都是免费提供的。 Operator类提供对generics算术的访问; 并且存在SumAverage等的通用实现(作为扩展方法) – 并且除了原语之外还可以使用具有合适运算符的任何类型。 因此,例如,您可以使用Sum with Complex等。

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

使用文档中显示了sum的简化示例:

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

虽然IIRC的实际实施还有一点……

顺便说一下,请注意dynamic (在.NET 4.0 / C#4.0中)应该支持运算符,但我们必须等待beta才能看到它的作用。 从我之前在CTP中查看dynamic ,我预计它会比MiscUtil代码慢一点,但我们会看到。

您可以使用IEnumerable.Sum函数

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

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

您可以使用内置的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等常用聚合的内置函数。 希望这可以帮助

亚历克斯