Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建组合矩阵_C#_Algorithm_Matrix_Permutation_Combinations - Fatal编程技术网

C# 构建组合矩阵

C# 构建组合矩阵,c#,algorithm,matrix,permutation,combinations,C#,Algorithm,Matrix,Permutation,Combinations,我相信这个问题已经被问过无数次了,但是当我搜索所有的例子时都不太合适,所以我想我还是应该问一下 我有两个数组,每个数组总是包含6个项目。例如: string[] Colors= new string[] { "red", "orange", "yellow", "green", "blue", "purple" }; string[] Foods= new string[] { "fruit", "grain", "dairy", "meat", "sweet", "veget

我相信这个问题已经被问过无数次了,但是当我搜索所有的例子时都不太合适,所以我想我还是应该问一下

我有两个数组,每个数组总是包含6个项目。例如:

string[] Colors=
    new string[] { "red", "orange", "yellow", "green", "blue", "purple" };

string[] Foods=
    new string[] { "fruit", "grain", "dairy", "meat", "sweet", "vegetable" };
meal[0]=
    new Pair[] { 
        new Pair { One="red", Two="fruit" }, 
        new Pair { One="orange", Two="grain" }, 
        new Pair { One="yellow", Two="dairy" }, 
        new Pair { One="green", Two="meat" }, 
        new Pair { One="blue", Two="sweet" }, 
        new Pair { One="purple", Two="vegetable" } 
    };
在这两个阵列之间,有36种可能的组合(例如“红色水果”、“红色谷物”)

现在我需要进一步将这些值分组为六个唯一值

例如:

string[] Colors=
    new string[] { "red", "orange", "yellow", "green", "blue", "purple" };

string[] Foods=
    new string[] { "fruit", "grain", "dairy", "meat", "sweet", "vegetable" };
meal[0]=
    new Pair[] { 
        new Pair { One="red", Two="fruit" }, 
        new Pair { One="orange", Two="grain" }, 
        new Pair { One="yellow", Two="dairy" }, 
        new Pair { One="green", Two="meat" }, 
        new Pair { One="blue", Two="sweet" }, 
        new Pair { One="purple", Two="vegetable" } 
    };
饭菜在哪里

Pair[][] meal;
在我的“膳食”列表中不能重复任何元素。所以只有一个“红色”物品和一个“肉”物品,等等


我可以很容易地根据前两个数组创建对,但我在如何最好地将它们组合成独特的组合方面还没有定论

根据要求,我将具体说明我如何看待排序方面的问题。我知道,由于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;
    }
资料来源:

上面的代码将值在字符串数组中的位置随机化。如果您将颜色和食物数组传递到此函数中,您将通过引用这两个元素的特定索引来获得它们的唯一配对

由于数组是随机排列的,所以索引为0、1、2等的两个数组的配对是唯一的。但是,问题要求创建对。然后应该创建一个Pair类,该类在颜色和食物的特定索引处接受一个值。颜色[3]和食物[3]

 public class Pair
{
     public string One;
     public string Two;
     public Pair(string m1, string m2)
     {
         One = m1;
         Two = m2;
     }
}
因为我们已经对数组和类进行了排序以包含唯一的配对,所以我们只需创建一个MEIN数组并用配对填充它

如果我们想创造一对新的,我们会

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]);
    } 
Pair[]餐=新的一对[Colors.Length-1];
对于(int i=0;i
这段代码创建了MEIN数组,并根据颜色的长度定义了它的索引数。然后,代码循环遍历颜色值的总数,同时创建新的成对组合,并将它们放入菜单中。此方法假定阵列的长度相同,可以轻松检查最小阵列

完整代码
private void Form1\u加载(对象发送方,事件参数e)
{
字符串[]颜色=新字符串[]{“红色”、“橙色”、“黄色”、“绿色”、“蓝色”、“紫色”};
字符串[]Foods=新字符串[]{“水果”、“谷物”、“乳制品”、“肉类”、“糖果”、“蔬菜”};
颜色=洗牌(颜色);
食物=洗牌(食物);
Pair[]餐=新的Pair[Colors.Length-1];
对于(int i=0;i1;i--)
{
int iRdm=rdm.Next(i);
字符串cTemp=c[iRdm];
c[iRdm]=c[i-1];
c[i-1]=cTemp;
}
返回c;
}
}
公共类对
{
公共字符串1;
公共字符串二;
公共对(字符串m1、字符串m2)
{
1=m1;
二=平方米;
}
}
-原职-
您可以简单地洗牌数组。这将允许使用相同的方法填充膳食,但结果不同。Fisher Yates shuffle上有一篇帖子

有720种可能的组合可以满足您的需要。从你的问题中不清楚你是想列举所有720个,还是随机选择一个或是什么。我将假设后者

更新:根据评论,这一假设是不正确的。我将开始一个新的答案


首先,生成第二个数组的置换。您可以使用Fischer-Yates-Knuth shuffle在适当的位置执行此操作;在StackOverflow上有许多这样做的示例。或者,您可以通过使用随机键进行排序,使用LINQ生成置换

前一种技术即使项目数量很大也很快,但会对现有数组进行变异。第二种技术比较慢,特别是如果项目数量非常大,而事实并非如此

第二种技术最常见的错误是在guid上排序。guid保证是唯一的,而不是随机的

无论如何,生成一个查询,该查询在执行时将排列第二个数组:

Random random = new Random();
IEnumerable<string> shuffled = from food in foods 
                               orderby random.NextDouble() 
                               select food;

简单明了。

好的,您需要一个包含所有720个可能序列的序列。这有点棘手,但可以做到

基本思路与我之前的回答相同。在这一回答中,我们:

  • 随机生成一个排列
  • 将已置换的第二个数组与未置换的第一个数组压缩
  • 从查询中生成了一个数组
现在我们将做同样的事情,除了生成所有置换,而不是随机生成置换

从获取此库开始:

好的,我们需要对六个i进行所有排列
Pair[] finalResults = results.ToArray();
Permutations<string> permutations = new Permutations<string>(foods);
IEnumerable<List<Pair>> query = 
    from permutation in permutations
    select colors.Zip(permutation, (color, food)=>new Pair(color, food)).ToList();
List<List<Pair>> results = query.ToList();