根据要求,我将具体说明我如何看待排序方面的问题。我知道,由于 C# 是一种高级语言,因此有大量快速简便的库和对象可用于将其减少到最少的代码。这个答案实际上是通过实现排序逻辑来尝试解决问题。
最初阅读这个问题时,我想起了整理一副纸牌。这两个数组非常类似于西装数组和面值数组。由于解决洗牌的一种方法是将数组随机化,然后选择一张将两者结合的牌,因此您可以在此处应用相同的逻辑。
排序作为一种可能的解决方案
Fisher-Yates排序算法本质上循环遍历数组的所有索引,将当前索引与随机索引交换。这创建了一种相当有效的排序方法。那么这如何适用于手头的问题呢?一种可能的实现可能是......
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 等处的两个数组的配对是唯一的。然而,问题要求创建对。然后应该创建一个 Pair 类,该类在 Colors 和 Foods 的特定索引处接收一个值。即...颜色[3] 和食物[3]
public class Pair
{
public string One;
public string Two;
public Pair(string m1, string m2)
{
One = m1;
Two = m2;
}
}
由于我们已经对数组和一个类进行了排序以包含唯一的配对,因此我们只需创建膳食数组并使用 Pairs 填充它。
如果我们想创造一对新的,我们会...
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]);
}
这部分代码创建膳食数组并通过颜色的长度定义其索引数。然后代码循环遍历颜色值的总数,同时创建新的配对组合并将它们放入餐中。此方法假设数组的长度相同,可以轻松检查最小的数组。
完整代码
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 Here的帖子