如何实现通用方法对不同的值类型进行数学计算
我有一个接受IEnumerable-decimals和性能各种数学函数的方法。 我想在IEnumerable-int-上使用相同的方法。 我该如何实现? 例如找一个简单的总和?
void Calculate(IEnumerable ListOFNumbers) { int count= ListofNumbers.Count(); ?sum=?; }
这在MiscUtil中都是免费提供的。 Operator
类提供对generics算术的访问; 并且存在Sum
, Average
等的通用实现(作为扩展方法) – 并且除了原语之外还可以使用具有合适运算符的任何类型。 因此,例如,您可以使用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等常用聚合的内置函数。 希望这可以帮助
亚历克斯