我们在C#中构建了一个工具,向用户询问一系列多项选择题,然后根据他们的答案显示产品列表。
我们没有做任何复杂的逻辑,我们只有与特定答案相关的产品,如果选择了答案,那么该产品会被添加到结果列表中。
我们最终会得到我们获得所有产品或没有产品的情况,因此我们需要看一下更彻底的逻辑编码方式。
首先,我在C#中构建一个实用程序应用程序来帮助我们验证该工具。我希望该实用程序执行的第一项任务是返回所有可能的答案组合。我陷入了困境。这是让我头疼的数学问题之一。这是问题的样子:
有人可以让我开始正确的方向,如何通过C#返回所有可能的答案组合列表?感谢。
答案 0 :(得分:9)
您想要的操作称为笛卡尔积。例如,如果第一和第二个问题的可能答案为{ a, b, c }
和{ d, e }
,则笛卡尔积为{ {a, d}, {b, d}, {c, d}, {a, e }, {b, e}, {c, e} }
。
我写了一篇关于计算任意多个序列的笛卡尔积的文章;你可以在这里找到它:
http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
另请参阅此StackOverflow问题:
答案 1 :(得分:1)
这是一个简单的例子,希望能够说明一种(递归)技术:
void Main()
{
int[] counts = new [] { 2, 2 };
Choose(counts, 0, new Stack<string>());
}
void Choose(int[] AnswerCounts, int start, Stack<string> chosen) {
for (int a=1; a<= AnswerCounts[start]; a++) {
chosen.Push("Answer " + a.ToString());
if (start < AnswerCounts.Length-1) {
Choose(AnswerCounts, start+1, chosen);
}
else {
Console.WriteLine(string.Join(", ", chosen.ToArray()));
}
chosen.Pop();
}
}
输出:
Answer 1, Answer 1
Answer 2, Answer 1
Answer 1, Answer 2
Answer 2, Answer 2