假设我有一个项目列表,每个项目都由一个简单的结构定义
struct simpleItem
{
String Category1;
String Category2;
...
String CategoryN;
}
每个项目都有属于某些类别的一系列值。在处理列表时已知类别N的数目,并且每个项目有相同的类别数量,每个类别只有一个值,没有重复的项。但是,每个列表可以有不同的类别集。
我在寻找一种方法,将这些项目按类别分组,如果将这些组分解为单个项目,通过组合每个类别排列,我将得到原来的组合,没有重复。
小组的结果是:
struct grouped
{
String[] Category1;
String[] Category2;
...
String[] CategoryN;
}
示例
为了这个例子,我们将限制在3类,但可以有N。
类别
动物,眼睛颜色,毛皮
选择“动物”类:猫、狗、鼠、马
选择“眼睛颜色”类别:蓝色、黄色、绿色、红色、橙色
选择“毛茸茸”类:长,短,卷
如果列表中包含了这三个类别的所有排列,那么最终结果将是
组1 :
动物
眼睛蓝色,黄色,绿色,红色,橙色
皮毛
例如,如果我有一个子列表:
让我们调用这个列表,输入(A)
将这些项目分组后,我们可以得到:(可能还有其他可能性)。分组标准是尽可能减少输出组。
组1:
动物
Eye Color [Blue ]
Fur [Long, Short]
组2:
动物-可接受性
Eye Color [Green ]
Fur [Long]
第3组:
/T1593-1989动物商品转归性、转产性、变价
眼睛颜色红,蓝
皮毛、商品等
让我们调用这些组,输出(B)
正如我们所看到的,通过组合结果组的每个项,我们将返回到(A)中7个元素的原始输入列表。
问题
因此,我试图编写一个生成这些组的算法。我试着用LINQ做这件事,但我也愿意听取其他建议。从(A)到(B)的任何建议
发布于 2013-08-26 15:22:28
所以,看看你的例子。首先,它将第一组和第二组配对。前两个类别集相同,第三个类别集不同,因此可以合并它们。现在您有了一个列表,即:
接下来我们比较(新的)第一组和第二组。第一和第三类都不匹配,没有合并。接下来我们比较第一和第三,同样的两个类别是不匹配的。第一组与其他任何一组都不匹配。现在我们进入第二组。我们把它和第三个配对。它可以合并,因为前两类是不同的:
现在我们重新开始,将第一组和第二组配对。他们匹配。第一类是不同的,第二个是相同的,第三个是一样的。现在是:
我们现在把第一个和另外三个比较一下,没有一个能与之匹配。然后我们将第二个和另外两个进行比较,没有一个能与之匹配。最后,第三和第四类将匹配,因为只有第二类不同:
最后,我们将通过所有的组合,没有一个组将匹配合并条件,我们完成了。
https://stackoverflow.com/questions/18447375
复制相似问题