我正在一个个性化的Math类中工作,我打算实现基本的操作方法,以便他们以简单的方式进行加,减,乘或除,而不必每次都调用运算符+ - * /
。
public class XMath
{
public static double Sum(params double[] values)
{
double result = 0;
if (values.Length < 1 || values is null) result = 0;
else if (values.Length == 1) result = values[0];
else foreach (double value in values) result += value;
return result;
}
public static double Subtract(params double[] values)
{
double result = 0;
if (values.Length < 1 || values is null) result = 0;
else if (values.Length == 1) result = values[0];
else foreach (double value in values) result -= value;
return result;
}
public static double Multiply(params double[] values)
{
double result = 0;
if (values.Length < 1 || values is null) result = 0;
else if (values.Length == 1) result = values[0];
else foreach (double value in values) result *= value;
return result;
}
public static double Divide(params double[] values)
{
double result = 0;
if (values.Length < 1 || values is null) result = 0;
else if (values.Length == 1) result = values[0];
else foreach (double value in values) result /= value;
return result;
}
}
我的问题是Sum方法完美无缺,但其他方法却产生了错误的结果
所以,如果 + = 它可以工作,因为 - = , * = 和 / = 没有< / p>
答案 0 :(得分:6)
主要问题是您使用0初始化result
变量。
假设数组double[] values = new [] { 1.0, 2.0, 3.0 }
,您的Sum
方法计算0 + 1 + 2 + 3
,Subtract
计算0 - 1 - 2 - 3
,Multiply
计算0 * 1 * 2 * 3
等
额外0对总和没有影响,但它会影响其他操作。
您应该使用数组的第一个元素而不是0来初始化您的操作。
您还可以查看可以简化代码的Aggregate方法
values.Aggregate((x, y) => x + y);
// ...
values.Aggregate((x, y) => x - y);
// ...
values.Aggregate((x, y) => x * y);
// ...
values.Aggregate((x, y) => x / y);
答案 1 :(得分:1)
这是一个for循环优于foreach循环的实例
public static double Sum(params double[] values)
{
if (values.Length < 1 || values is null)
return 0;
double result = values[0];
for(int i = 1; i < values.Length; i++)
result += values[i];
return result;
}
答案 2 :(得分:0)
您可以使用Enumerable.Aggregate<TSource>(IEnumerable<TSource>, Func<TSource, TSource, TSource>)
表单System.Linq
汇总使用IEnumerable
,但在您的情况下会创建double
。
示例(和数组为IEnumerable
):
using System.Linq;
double[] values = new [] {5, 9, 3};
values.Aggregate((x, y) => x + y);