我有一个接受IEnumerable-decimals和性能各种数学函数的方法。我想在IEnumerable-int-上使用相同的方法。我该如何实现?比如找一个简单的总和?
void Calculate<T>(IEnumerable <T> ListOFNumbers)
{
int count= ListofNumbers.Count();
?sum=?;
}
答案 0 :(得分:3)
MiscUtil全部免费提供。 Operator
类提供对泛型算术的访问;并且存在Sum
,Average
等的通用实现(作为扩展方法) - 除了基元之外,还使用合适的运算符与任何类型一起使用。例如,您可以使用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。 希望这有帮助
亚历