数组的基本操作
Basic operations with arrays
我正在研究个性化数学 class,我打算实现基本的运算方法,以便它们以简单的方式进行加、减、乘或除,而无需调用运算符 + - * /
每次。
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 方法完美运行,但其他方法却抛出错误结果
So, if += it works, because -=, *= and /= no
主要问题是您将 result
变量初始化为 0。
假设数组 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);
这是 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;
}
您可以使用 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);
我正在研究个性化数学 class,我打算实现基本的运算方法,以便它们以简单的方式进行加、减、乘或除,而无需调用运算符 + - * /
每次。
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 方法完美运行,但其他方法却抛出错误结果
So, if += it works, because -=, *= and /= no
主要问题是您将 result
变量初始化为 0。
假设数组 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);
这是 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;
}
您可以使用 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);