-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 つの変数に同じ値を含む 2 つの配列が含まれるようになるわけではなく、2 つの値がメモリ内の同じ 1 つの配列を参照するようになります。一方を変更すると、もう一方も変更されたように見えます。2 つの変数は、同じ住所の家の住所が記載された付箋と考えてください。家に行って家具を並べ替えると、「両方の家」が変わって見える。ただし家は一軒のみ。

  2. 配列を randomize メソッドに渡すときは、配列のコピーではなく、配列への参照を渡していることになります。オリジナルに取り組んでいます。これは、渡される配列と返される配列が、メモリ内の同じ 1 つの配列であることを意味します。

  3. おそらく質問のバグの原因ではありませんが、ループで使用するたびに新しい Random オブジェクトを作成しないでください。代わりに、一度作成して再利用してください。そうしないと、いくつかの異なる値が返される危険があります。

最後に、「これはビジュアル スタジオまたは C# のバグです」という直感的な反応がある場合、それはほとんどありません。常に、自分のコードに問題があるという前提で作業してください。「ほとんどない」ということは、C# や Visual Studio のバグに偶然遭遇する可能性はまったくないということです。

別の配列と同じ内容で新しい配列を作成するには、いくつかのオプションがあります。

  1. 明示的に配列を作成し、要素を 1 つずつコピーします。

    random_for_combo = new string[forcombo.Length];
    for (int i = 0; i < forcombo.Length; i++)
        random_for_combo[i] = forcombo[i];
    
  2. for ループの代わりにArray.Copyを使用します。

    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 に答える