アイテムのリストがあるとしましょう。各アイテムは単純な構造で定義されています
struct simpleItem
{
String Category1;
String Category2;
...
String CategoryN;
}
各項目には、いくつかのカテゴリに属する一連の値があります。カテゴリの数 N はリストの処理時に既知であり、各項目には同じ量のカテゴリがあり、カテゴリごとに値が 1 つだけあり、重複する項目はありません。ただし、各リストには異なるカテゴリ セットを含めることができます。
これらのアイテムをカテゴリごとにグループ化する方法を探しています。これらのグループが、カテゴリの各順列を組み合わせて単一のアイテムに分解された場合、重複のない元の組み合わせになります。
グループの結果は次のようになります。
struct grouped
{
String[] Category1;
String[] Category2;
...
String[] CategoryN;
}
例
この例では、カテゴリを 3 つに制限しますが、N 個のカテゴリが存在する可能性があります。
カテゴリー
動物、目の色、毛皮「動物」カテゴリの選択肢: 猫、犬、ネズミ、馬
「目の色」カテゴリの選択肢:青、黄、緑、赤、オレンジ
「毛皮」カテゴリの選択肢: ロング、ショート、カーリー
リストにこれら 3 つのカテゴリの順列がすべて含まれている場合、最終結果は次のようになります。
グループ 1 :
動物 [猫、犬、ネズミ、馬]
目の色 [青、黄、緑、赤、オレンジ]
毛皮 [ロング、ショート、カーリー]
たとえば、サブリストがある場合:
- 猫、青、長い
- 猫、青、短い
- 犬、青、長い
- 犬、青、短い
- 犬、グリーンロング
- ラット、レッド、ショート
- ラット、ブルー、ショート
このリストを入力(A)としましょう
これらの項目を group にグループ化した後、 : になる可能性があります (他の可能性がある可能性があります)。グループ化の基準は、出力グループをできるだけ少なくすることです。
グループ 1:
動物 [猫、犬]
目の色 [青]
毛皮 [長い、短い]
グループ 2:
動物 [犬]
目の色 [緑]
毛皮 [ロング]
グループ 3:
動物 [ラット]
目の色 [赤、青]
毛皮 [短い]
これらのグループを出力(B)と呼びましょう
ご覧のとおり、結果のグループの各項目を組み合わせることで、(A)の 7 つの要素の元の入力リストに戻ります。
質問
そこで、これらのグループを生成するアルゴリズムを作成しようとしています。私はLINQでこれをやろうとしていますが、他の提案も受け付けています。(A )から(B)に行く方法について何か提案はありますか?