【问题标题】:How can I change items inside a double array?如何更改双数组中的项目?
【发布时间】:2020-06-22 01:37:31
【问题描述】:

如何根据简单条件更改双变量中的项目?

检查这个例子:

public partial class Form1 : Form
{

    double[] vk = new double[11] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    ...
    ...

    void setDouble()
    {
        if (bunifuDropdown1.selectedIndex == 0)
        {
            double[] vk = new double[11] { 2, 4.86, 11.81, 28.68, 69.64, 169.13, 410.75, 997.55, 2422.61, 5883.49, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 1)
        {
            double[] vk = new double[11] { 2, 4.51, 10.14, 22.81, 51.31, 115.46, 259.78, 584.51, 1315.14, 2959.07, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 2)
        {
            double[] vk = new double[11] { 2, 6.86, 18.67, 47.33, 116.94, 286.01, 696.59, 1693.71, 4115.30, 9996.29, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 3)
        {
            double[] vk = new double[11] { 2, 6.51, 16.64, 39.43, 90.72, 206.12, 465.78, 1049.99, 2364.49, 5322.09, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 4)
        {
            double[] vk = new double[11] { 2, 6.86, 18.67, 47.33, 108.94, 264.58, 642.55, 1560.47, 3789.71, 9203.58, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 5)
        {
            double[] vk = new double[11] { 2, 6.51, 16.64, 39.43, 82.72, 186.12, 418.78, 942.24, 2120.05, 4770.11, 21000 };
        }
    }

执行setDouble()函数后,这些值没有改变。未发现错误。我该如何解决这个问题?

【问题讨论】:

  • 每个double[] vkif 语句的范围内创建一个名为vk 的新变量。您应该在变量范围内查看this question
  • double[] vk = new double[11] ...前面的double[]全部去掉,变成vk = new double[11]...
  • 您正遭受可变阴影的困扰。

标签: c# arrays .net


【解决方案1】:

您在函数中重新声明 vk,而 shadows 是原来的。
试试这个:

public partial class Form1 : Form
{
    double[] vk = new double[11] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    ...
    ...

    void setDouble()
    {
        if (bunifuDropdown1.selectedIndex == 0)
        {
            // NOTE: Here instead of "double[] vk = ..." we have "vk = ..."
            vk = new double[11] { 2, 4.86, 11.81, 28.68, 69.64, 169.13, 410.75, 997.55, 2422.61, 5883.49, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 1)
        {
            vk = new double[11] { 2, 4.51, 10.14, 22.81, 51.31, 115.46, 259.78, 584.51, 1315.14, 2959.07, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 2)
        {
            vk = new double[11] { 2, 6.86, 18.67, 47.33, 116.94, 286.01, 696.59, 1693.71, 4115.30, 9996.29, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 3)
        {
            vk = new double[11] { 2, 6.51, 16.64, 39.43, 90.72, 206.12, 465.78, 1049.99, 2364.49, 5322.09, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 4)
        {
            vk = new double[11] { 2, 6.86, 18.67, 47.33, 108.94, 264.58, 642.55, 1560.47, 3789.71, 9203.58, 21000 };
        }
        if (bunifuDropdown1.selectedIndex == 5)
        {
            vk = new double[11] { 2, 6.51, 16.64, 39.43, 82.72, 186.12, 418.78, 942.24, 2120.05, 4770.11, 21000 };
        }
    }

【讨论】:

  • 只是阴影一些变量:)
  • 解决了这个问题。只有一项改进:每次更改下拉值时都会创建一个新数组。我会提前创建一个双数组的静态数组,然后按索引设置引用。
  • 当然!在这里,我刚刚修复了导致问题易于理解的原始代码部分。但是我们当然可以按照您提到的方式重构代码。
【解决方案2】:

在您当前的代码中,您声明了vk 局部变量,它将在离开其范围时消失

void setDouble()
{
    if (bunifuDropdown1.selectedIndex == 0)
    {
        // Local variable...
        double[] vk = 
    }   // which will disappear here (on leaving its scope)

    ... 
    if (bunifuDropdown1.selectedIndex == 2)
    {
        // Yet another local variable...
        double[] vk = 
    }   // which will disappear here (on leaving its scope)
    ...
} 

请注意,巨大的setDouble 函数使得这种错误很容易产生并且很难被发现。

让我们分离数据本身和业务逻辑,我们就会有这样一个易于阅读的代码

   public partial class Form1 : Form {
      private static readonly double[][] s_AllVks = new double[][] {
        new double[] { 2, 4.86, 11.81, 28.68,  69.64, 169.13, 410.75,  997.55, 2422.61, 5883.49, 21000 },
        new double[] { 2, 4.51, 10.14, 22.81,  51.31, 115.46, 259.78,  584.51, 1315.14, 2959.07, 21000 }, 
        new double[] { 2, 6.86, 18.67, 47.33, 116.94, 286.01, 696.59, 1693.71, 4115.30, 9996.29, 21000 }, 
        new double[] { 2, 6.86, 18.67, 47.33, 108.94, 264.58, 642.55, 1560.47, 3789.71, 9203.58, 21000 },
        new double[] { 2, 6.51, 16.64, 39.43,  82.72, 186.12, 418.78,  942.24, 2120.05, 4770.11, 21000 }, 
      }

      double[] vk = new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 

      void setDouble() {
        if (bunifuDropdown1.selectedIndex >= 0 && bunifuDropdown1.selectedIndex < s_AllVks.Length)
          vk = s_AllVks[bunifuDropdown1.selectedIndex] 
      } 

【讨论】:

  • 注意:建议的解决方案假定vk 从未以任何其他方式发生变异。如果是,那么在对setDouble 的任何调用之后,变异vk(现在是s_AllVks 中的条目之一的别名)也将变异相应的s_AllVks 条目,所以未来的setDoubles 设置了条目保留突变。每次原始代码都会从头开始,使用一个无别名的数组。
  • @ShadowRanger OP 没有说明是否是这种情况。无论哪种方式,如果是,则可以轻松更改此代码,以便设置副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2017-04-13
  • 1970-01-01
  • 2012-10-12
  • 2015-08-23
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多