リクエストに応じて、並べ替えに関する問題の見方を具体的に説明します。C# は高水準の言語であるため、これを最小限のコードに減らすために使用できる、すばやく簡単なライブラリとオブジェクトがたくさんあることを知っています。この回答は、並べ替えロジックを実装して実際に質問を解決しようとしています。
この質問を最初に読んだとき、カードのデッキをソートすることを思い出しました。2 つの配列は、スーツの配列と額面の配列に非常に似ています。シャッフルを解決する 1 つの方法は、配列をランダム化し、両方を組み合わせたカードを選ぶことであるため、ここでも同じロジックを適用できます。
可能な解決策としての並べ替え
Fisher-Yatesソート アルゴリズムは、基本的に配列のすべてのインデックスをループ処理して、現在のインデックスをランダムなインデックスと交換します。これにより、かなり効率的な並べ替え方法が作成されます。では、これは当面の問題にどのように適用されますか? 1つの可能な実装は...
static Random rdm = new Random();
public string[] Shuffle(string[] c)
{
var random = rdm;
for (int i = c.Length; i > 1; i--)
{
int iRdm = rdm.Next(i);
string cTemp = c[iRdm];
c[iRdm] = c[i - 1];
c[i - 1] = cTemp;
}
return c;
}
出典: Fisher-Yates Shuffle
上記のコードは、文字列配列内の値の位置をランダム化します。Colors と Food の配列をこの関数に渡すと、両方の特定のインデックスを参照することで、Pairs の一意の組み合わせを取得できます。
配列がシャッフルされるため、インデックス 0、1、2 などの 2 つの配列のペアリングは一意です。ただし、この問題では、ペアを作成する必要があります。次に、Colors と Foods の両方の特定のインデックスで値を取得する Pair クラスを作成する必要があります。つまり...色[3]と食べ物[3]
public class Pair
{
public string One;
public string Two;
public Pair(string m1, string m2)
{
One = m1;
Two = m2;
}
}
一意の組み合わせを含む配列とクラスを並べ替えたので、単純に食事配列を作成し、それにペアを設定します。
新しいペアを作成したい場合は...
Pair temp = new Pair(Colors[0],Foods[0]);
この情報を使用して、最終的に食事配列を設定できます。
Pair[] meal = new Pair[Colors.Length - 1];
for (int i = 0; i < Colors.Length - 1; i++)
{
meal[i] = new Pair(Colors[i],Foods[i]);
}
コードのこのセクションでは、食事配列を作成し、Colors の長さによってインデックスの数を定義します。次にコードは、新しいペア コンボを作成して食事にドロップしながら、Color 値の総数をループします。このメソッドは、配列の長さが同じであることを前提としているため、最小の配列を簡単に確認できます。
完全なコード
private void Form1_Load(object sender, EventArgs e)
{
string[] Colors = new string[] { "red", "orange", "yellow", "green", "blue", "purple" };
string[] Foods = new string[] { "fruit", "grain", "dairy", "meat", "sweet", "vegetable" };
Colors = Shuffle(Colors);
Foods = Shuffle(Foods);
Pair[] meal = new Pair[Colors.Length - 1];
for (int i = 0; i < Colors.Length - 1; i++)
{
meal[i] = new Pair(Colors[i],Foods[i]);
}
}
static Random rdm = new Random();
public string[] Shuffle(string[] c)
{
var random = rdm;
for (int i = c.Length; i > 1; i--)
{
int iRdm = rdm.Next(i);
string cTemp = c[iRdm];
c[iRdm] = c[i - 1];
c[i - 1] = cTemp;
}
return c;
}
}
public class Pair
{
public string One;
public string Two;
public Pair(string m1, string m2)
{
One = m1;
Two = m2;
}
}
-元の投稿-
配列を単純にシャッフルできます。これにより、同じ方法で食事にデータを入力できますが、結果は異なります。Fisher-Yates shuffle に関する記事はこちら