数组的基本操作

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 + 3Subtract 计算 0 - 1 - 2 - 3Multiply 计算 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);