这似乎是工作室或编译器中的错误

时间:2013-05-16 08:19:00

标签: c#

问题是在随机化 func之后,数组 forcombo 等于 random_for_combo ,但我将它们等同于任何地方。请帮忙。

    private void button1_Click(object sender, EventArgs e)
    {
        string sub = "1#2#3#4#5#6#7#8#9#10";
        string[] split = sub.Split('#');
        string[] forcombo = new string[split.Length / 2];
        int s = 0;
        for (int j = 1; j <= split.Length - 1; j += 2)
        {
            forcombo[s] = split[j];
            s++;
        }
        string[] random_for_combo = new string[forcombo.Length];
        random_for_combo = forcombo;
        MessageBox.Show(forcombo[0] + forcombo[1] + forcombo[2] + forcombo[3] + forcombo[4], "Before random");
        random_for_combo = RandomizeStrings(random_for_combo);
        MessageBox.Show(forcombo[0]+forcombo[1]+forcombo[2]+forcombo[3]+forcombo[4], "After random");
    }
    public static string[] RandomizeStrings(string[] arr)
    {

        ArrayList l1 = new ArrayList(arr.Length);
        ArrayList l2 = new ArrayList(arr.Length);
        foreach (object k in arr)
        {
            l1.Add(k.ToString());
        }
        while (l1.Count > 0)
        {
            Random rnd = new Random();
            int rand = rnd.Next(l1.Count);
            l2.Add(l1[rand]);
            l1.RemoveAt(rand);
            Thread.Sleep(rnd.Next(50));
        }
        for (int i = 0; i < l2.Count; i++)
        {
            arr[i] = l2[i].ToString();
        }
        return arr;
    }

完成问题的一些无助信息..

2 个答案:

答案 0 :(得分:3)

此代码存在一些问题:

  1. 您正在将引用从一个数组变量复制到另一个:

    random_for_combo = forcombo;
    

    这不会使两个变量包含两个包含相同值的数组,这两个值现在引用内存中的同一个数组。改变一个,看起来另一个也改变了。可以把这两个变量想象成便条纸,上面有房子的地址,地址相同。如果你去房子并重新安排家具,“两院”似乎都会改变。但是只有一所房子。

  2. 当您将数组传递给randomize方法时,您将引用传递给数组,而不是数组的副本,这意味着如果你改变了数组的内容,你就不是在制作副本,而是在处理原作。这意味着您传递的数组和返回的数组与内存中的一个数组相同

  3. 可能不是你问题中的bug的来源,但是你不应该每次在循环中使用它时构造新的Random对象,而是构造它一次并重用,否则你冒险回到几个不同的价值观。

  4. 最后,如果你的直觉反应是“这是视觉工作室或C#中的一个错误”,那么它几乎永远不会,总是假设你自己的代码是错误的。通过“几乎从不”,我会说你偶然遇到C#或Visual Studio中的错误的机会是没有。

    要创建一个具有相同内容的新数组,您有几个选项:

    1. 显式创建数组并逐个复制元素:

      random_for_combo = new string[forcombo.Length];
      for (int i = 0; i < forcombo.Length; i++)
          random_for_combo[i] = forcombo[i];
      
    2. 使用Array.Copy代替for-loop:

      random_for_combo = new string[forcombo.Length];
      Array.Copy(forcombo, random_for_combo, forcombo.Length);
      
    3. 使用新的Linq ToArray扩展方法:

      random_for_combo = forcombo.ToArray();
      

      请注意,即使这看起来像无操作(因为forcombo是一个数组),你实际上会获得一个具有相同内容的新数组。

答案 1 :(得分:0)

但你在这里做了:

random_for_combo = forcombo;

你设置random_for_combo所以它指向forcombo。

如果要使用原始数组,则需要将其复制到新数组 像这样的东西(而不是上面的那一行)

        string[] random_for_combo = new string[forcombo.Length];
        for (int i = 0; i < forcombo.Length; i++)
        {
            random_for_combo[i] = forcombo[i];
        }