【问题标题】:Basic operations with arrays数组的基本操作
【发布时间】:2018-03-24 01:29:38
【问题描述】:

我在一个个性化的数学课上工作,我打算实现基本的运算方法,以便它们以简单的方式进行加、减、乘或除,而不必每次都调用运算符+ - * /

    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 方法运行良好,但其他方法却抛出了错误的结果

所以,如果 += 有效,因为 -=*=/= 没有

【问题讨论】:

  • 你说它们不起作用是什么意思?结果关闭还是抛出异常?
  • @Vache 他们抛出了错误的结果
  • 预期行为与结果?
  • 还应该增加一些防止被0除的防护
  • 在这些行中:if (values.Length &lt; 1 || values is null) 您应该颠倒这些检查的顺序。当条件的第二部分为真时,该行将抛出异常,因为在检查第二部分之前第一部分将失败。

标签: c# arrays operations


【解决方案1】:

主要问题是您将 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);

【讨论】:

  • 嗯,这会创建一个 IEnumerable,所以要获得结果,我必须使用 for 循环或类似的东西?
  • Aggregate 使用IEnumerable(数组为IEnumerable),但在您的情况下创建double
【解决方案2】:

这是一个 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;
    }

【讨论】:

  • 结果很好,但是您正在修改原始数组,这可能会导致调用者出现意外结果。
【解决方案3】:

您可以使用Enumerable.Aggregate&lt;TSource&gt;(IEnumerable&lt;TSource&gt;, Func&lt;TSource, TSource, TSource&gt;) 形式System.Linq

Aggregate 使用 IEnumerable,但在您的情况下创建 double

示例(数组为IEnumerable):

using System.Linq;

double[] values = new [] {5, 9, 3};

values.Aggregate((x, y) => x + y);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多