Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 从2D数组中获取所有组合_C#_Combinations_Permutation - Fatal编程技术网

C# 从2D数组中获取所有组合

C# 从2D数组中获取所有组合,c#,combinations,permutation,C#,Combinations,Permutation,我有一个2d数组,我想得到所有可能的组合。但我被困在如何做到这一点上了。我的数据数组如下所示: var data = new string[][] { new string[] {"pa", "ga", "ka"}, new string[] {"pb", "gb", "kb"} }; pa ga ka pa ga kb pa gb ka pa gb kb pb ga ka pb g

我有一个2d数组,我想得到所有可能的组合。但我被困在如何做到这一点上了。我的数据数组如下所示:

var data = new string[][]
            {
                new string[] {"pa", "ga", "ka"},
                new string[] {"pb", "gb", "kb"}
            };
pa ga ka
pa ga kb
pa gb ka
pa gb kb
pb ga ka
pb ga kb
pb gb ka
pb gb kb
我的预期输出如下:

var data = new string[][]
            {
                new string[] {"pa", "ga", "ka"},
                new string[] {"pb", "gb", "kb"}
            };
pa ga ka
pa ga kb
pa gb ka
pa gb kb
pb ga ka
pb ga kb
pb gb ka
pb gb kb
顺序也很重要。例如,我不能使组合ga-pa-ka。因为第一个项目需要以p开头,第二个项目需要以g开头,第三个项目需要以k开头。因此,我不能使用笛卡尔积

注意:在这个例子中,我有两行。也可能我有更多的行

var data=新字符串[][]
var data = new string[][]
        {
            new string[] {"pa", "ga", "ka"},
            new string[] {"pb", "gb", "kb"}
        };
    foreach(var first in data[0])
    {
        foreach(var second in data[1])
        {
            List<string> list = new List<string>(data[1]);
            list.Remove(second);
            var arrayList=list.ToArray();
            string[] myArray = new string[3];
            myArray[0] = first;
            myArray[1] = arrayList[0];
            myArray[2] = arrayList[1];
            Console.WriteLine("{0}", string.Join(" ", myArray));            
        }
    }
{ 新字符串[]{“pa”、“ga”、“ka”}, 新字符串[]{“pb”、“gb”、“kb”} }; foreach(数据[0]中的var第一个) { foreach(数据[1]中的第二个变量) { 列表=新列表(数据[1]); 列表。删除(第二个); var arrayList=list.ToArray(); 字符串[]myArray=新字符串[3]; myArray[0]=第一个; myArray[1]=arrayList[0]; myArray[2]=arrayList[1]; Console.WriteLine(“{0}”,string.Join(“,myArray)); } }
您可以使用Eric Lippert的解决方案,但首先需要转换输入

这里有一个转置方法:

此操作的输出为:

pa, ga, ka
pa, ga, kb
pa, gb, ka
pa, gb, kb
pb, ga, ka
pb, ga, kb
pb, gb, ka
pb, gb, kb

你的具体要求是什么。

特别是,看看(如果你对所有血淋淋的细节感兴趣,请阅读他提到的博客)。你确定这是重复的吗?在我的例子中,我只有两行来保持简单。但也有可能我有更多的行。我很确定-Eric的回答包含一个
IEnumerable
,这意味着你可以向它传递任意数量的数组。顺序对我来说也很重要。例如,对于Eric的答案,我从var data=new string[]{new string[]{“1”、“2”、“3”},new string[]{“x”、“y”、“z”};var x=data.CartesianProduct();1y的组合。这在我的情况下是不能用的。
pa, ga, ka
pa, ga, kb
pa, gb, ka
pa, gb, kb
pb, ga, ka
pb, ga, kb
pb, gb, ka
pb, gb, kb