【发布时间】:2014-10-13 15:04:50
【问题描述】:
我有一个迭代 C# 循环,它填充了最多 5 列的棋盘格模式。
这些值是成对的,它总是一个标题和每列的多个值,并且它将这些值组合成一个非重复的组合。
从我能想象到的最简单的解决方案开始,看了之后,我认为必须有更好的方法通过递归来解决这个问题。
以下是我迄今为止尝试过的示例:
List<EtOfferVariant> variants = new List<EtOfferVariant>();
_containers[0].Variant.ForEach(first =>
{
if (_containers.Count > 1)
{
_containers[1].Variant.ForEach(second =>
{
if (_containers.Count > 2)
{
_containers[2].Variant.ForEach(third =>
{
EtOfferVariant va = new EtOfferVariant();
va.OfferVariant1Type = _containers[0].VariantKey;
va.OfferVariant1 = first;
va.OfferVariant2Type = _containers[1].VariantKey;
va.OfferVariant2 = second;
va.OfferVariant3Type = third;
va.OfferVariant3 = _containers[3].VariantKey;
variants.Add(va);
});
}
else
{
EtOfferVariant va = new EtOfferVariant();
va.OfferVariant1Type = _containers[0].VariantKey;
va.OfferVariant1 = first;
va.OfferVariant2Type = second;
va.OfferVariant2 = _containers[1].VariantKey;
variants.Add(va);
}
});
}
else
{
EtOfferVariant va = new EtOfferVariant();
va.OfferVariant1Type = _containers[0].VariantKey;
va.OfferVariant1 = first;
variants.Add(va);
}
});
容器由字符串列表(值)和键(标题)组成。
这是一个缩短版OfferVariant 在实际示例中最多计数为 5。
我无法更改初始检查板结构,因为它是由现有数据库提供的。
以下是 2 个容器的数据输入和输出示意图:
容器 1:
- 钥匙:派
- 价值观:
- 覆盆子
- 草莓
容器 2:
- 关键:喝
- 值:
- 可乐,
- 咖啡
生成的输出将由 4 行组成,其中包含
编辑因为它很容易被误解,因为它在这里说明
结果将是由 4 列组成的数据库中的一行
Column 1 | Column 2 | Column 3 | Column 4
Pie | Raspberry | Drink | Cola
Pie | Raspberry | Drink | Coffee
Pie | Strawberry| Drink | Cola
Pie | Strawberry| Drink | Coffee
EtOfferVariant 是一个包含这些列的 ORM Poco
【问题讨论】:
-
从您的示例看来,您正在尝试创建笛卡尔积。在这种情况下,您可以编写一个通用算法,其中产品中的集合数不必固定:stackoverflow.com/a/16996888/98607。但是,这不涉及递归。
标签: c# recursion combinatorics iteration