-9

问题是在Randomize 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;
    }

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

4

2 回答 2

2

这段代码有几个问题:

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

    random_for_combo = forcombo;
    

    这不会使两个变量包含两个包含相同值的数组,这两个值现在引用内存中的同一个数组。改变一个,看起来另一个也改变了。将这两个变量想象成带有房屋地址的便利贴,相同的地址。如果你去房子里重新布置家具,“两所房子”就会出现变化。然而只有一所房子。

  2. 当您将数组传递给 randomize 方法时,您传递的是对数组的引用,而不是数组的副本,这意味着如果您更改数组的内容,则不是在处理副本,您重新制作原版。这意味着您传递的数组和返回的数组是内存中的同一个数组

  3. 可能不是您问题中错误的来源,但是您不应该每次在循环中使用它时都构造新的 Random 对象,而是构造一次并重用它,否则您可能会返回一些不同的值。

最后,如果你的直觉反应是“这是 Visual Studio 或 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 循环:

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

    random_for_combo = forcombo.ToArray();
    

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

于 2013-05-16T08:24:32.413 回答
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];
        }
于 2013-05-16T08:30:18.510 回答