有序独特组合

我有以下课程:

internal class Course { public int CourseCode { get; set; } public string DeptCode { get; set; } public string Name { get; set; } } 

以下代码是我的二维数组:

 Course[][] courses = new Course[3][]; courses[0] = new Course[] { new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR A" }, new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR B" } }; courses[1] = new Course[] { new Course() { CourseCode = 200, DeptCode = "EN", Name = "EN A" } }; courses[2] = new Course[] { new Course() { CourseCode = 300, DeptCode = "PHY", Name = "PHY A" } }; 

我想要做的是获得组中每个项目可以与其他组进行的不同组合; 例如,使用前面的代码,结果将是:

 1. EGR A - EN A - PHY A 2. EGR B - EN A - PHY A 

答案:为了获得可能的组合数量,我们可以使用产品规则 ,在上面的例子中,可能的组合将是(2 * 1 * 1)= 2,这实际上是我上面写的2种组合。

LordTakkera给出了完美的答案,非常感谢你!

您可以使用嵌套for循环:

 for (int i = 0; i < courses[0].Length; i++) { for (int j = 0; j < courses[1].Length; i++) { for (int k = 0; k < courses[2].Length; i++) { //Do whatever you need with the combo, accessed like: //courses[0][i], courses[1][j], courses[2][k] } } } 

当然,这个解决方案变得非常麻烦你需要的嵌套越多。 如果你需要更深入,我会使用某种递归函数来遍历集合并生成组合。

它会是这样的:

 class CombinationHelper { public List> GetAllCombinations(Course[][] courses) { return GetCourseCombination(courses, 0); } public List> GetCourseCombination(Course[][] courses, int myIndex) { List> combos = new List>(); for (int i = 0; i < courses[myIndex].Length; i++) { if (myIndex + 1 < courses.GetLength(0)) { foreach (List combo in GetCourseCombination(courses, myIndex + 1)) { combo.Add(courses[myIndex][i]); combos.Add(combo); } } else { List newCombination = new List() { courses[myIndex][i] }; combos.Add(newCombination); } } return combos; } } 

我测试了这个(用“int”代替“Course”以使validation更容易)并且它产生了所有8种组合(虽然不按顺序,递归往往会这样做。如果我想出订购代码,我会发布,但是它不应该太难 )。

递归函数对我来说已经足够难了,所以我的解释不会很好。 基本上,我们首先用“0”索引将整个事情踢掉(这样我们就从头开始)。 然后我们遍历当前数组。 如果我们不是“master”数组中的最后一个数组,我们将进入下一个子数组。 否则,我们创建一个新的组合,添加自己,并返回。

当递归堆栈“展开”时,我们将生成的组合添加到返回列表中,将其添加到其中,然后再次返回。 最终整个事情“解开”,你留下了所有组合的一个列表。

再一次,我确信这是一个非常令人困惑的解释,但递归算法(至少对我而言)本质上令人困惑。 我很乐意尝试详细说明你想要的任何一点。

看一下你的第二个索引 – 0或1.如果只查看它,你会看到一个从0到7的二进制数。

从0到7计数,将其转换为位并获得所需的组合模式。