假设我有一个项目列表,每个项目都由一个简单的结构定义
struct simpleItem
{
String Category1;
String Category2;
...
String CategoryN;
}
每个项目都有一系列属于某些类别的值。在处理列表时,类别数 N 是已知的,并且每个项目具有相同数量的类别,并且每个类别只有一个值,没有重复的项目。但是,每个列表都可以有不同的类别集。
我正在寻找一种按类别对这些项目进行分组的方法,如果通过组合类别的每个排列将这些组解构为单个项目,我将最终得到原始组合,没有重复。
一组结果将是:
struct grouped
{
String[] Category1;
String[] Category2;
...
String[] CategoryN;
}
例子
为了这个例子,我们将限制为 3 个类别,但可以有 N 个。
类别
动物,眼睛颜色,毛皮“动物”类别的选择:猫、狗、老鼠、马
“眼睛颜色”类别的选择:蓝色、黄色、绿色、红色、橙色
“毛皮”类别的选择:长、短、卷曲
如果列表包含这 3 个类别的所有排列,则最终结果将是
第 1 组:
动物 [猫、狗、鼠、马]
眼睛颜色 [蓝、黄、绿、红、橙]
毛皮 [长、短、卷]
如果我有一个子列表,例如:
- 猫,蓝色,长
- 猫,蓝色,短
- 狗,蓝色,长
- 狗,蓝色,短
- 狗,绿龙
- 大鼠,红色,短
- 大鼠,蓝色,短
我们称这个列表为 Input (A)
在将这些项目分组后,我们最终可以得到:(可能还有其他可能性)。分组标准是尽可能少的输出组。
第 1 组:
动物 [猫、狗]
眼睛颜色 [蓝色]
毛皮 [长、短]
第 2 组:
动物 [狗]
眼睛颜色 [绿色]
毛皮 [长]
第 3 组:
动物 [鼠]
眼睛颜色 [红、蓝]
毛皮 [短]
我们称这些组为输出(B)
正如我们所看到的,通过组合结果组的每个项目,我们将回到(A)中的 7 个元素的原始输入列表。
问题
所以,我正在尝试编写一个生成这些组的算法。我正在尝试使用 LINQ 执行此操作,但我也愿意接受其他建议。关于如何从(A)到达(B)有什么建议吗?