リストがあり、2の組み合わせから始めてリストの要素に対していくつかの操作を実行したいと思います。
以下が私のリストだとしましょう:
List<string> strArr = new List<string> { "A", "B", "C", "D", "E", "F", "G", "H" };
一度に2つの要素を選択すると、以下の組み合わせが生成されます:-( A、B)(A、C)(A、D)(A、E)(A、F)(A、G)(A、H) (B、C)(B、D)など
一度に3つの要素を選択すると、以下の組み合わせが生成されます:-( A、B、C)(A、B、D)(A、B、E)(A、B、F)(A、B、G) (A、B、H)(A、C、D)(A、C、E)(A、C、F)(A、C、G)(A、C、H)(A、D、E)( A、D、F)(A、D、G)(A、D、H)(A、E、F)(A、E、G)(A、E、H)(A、F、G)(A 、F、H)(A、G、H)(B、C、D)(B、C、E)(B、C、F)など
これらの組み合わせを取得するのは非常に簡単です。アルゴリズムに従って、nからk個の要素のすべての組み合わせを返し ましたが、正確な出力が得られます。
ただし、特定の条件を満たす場合に要素をリストから削除し続けるという別の要件があるため、このコードを使用できません。したがって、組み合わせの数は減少し続けます。したがって、私の場合はパフォーマンスが低下するため、LINQを使用してすべての組み合わせを取得する必要はありません。
私はそれを以下の方法で行うことを考えました:
List<string> strArr = new List<string> { "A", "B", "C", "D", "E", "F", "G", "H" };
// Loop for selecting combination of two elements at time
for (int i = 0; i < strArr.Count; i++)
{
for (int j = i + 1; j < strArr.Count; j++)
{
// Writing on Console
// Actually do some operation to check whether these two elements in list needs to be removed or not
Console.Write(strArr[i] + strArr[j]);
Console.WriteLine();
// Check whether current combination of 2 elements need to be removed or not
if (<< condition >>)
{
// Remove both the current elements
// Remove current element of outer loop
strArr.RemoveAt(i);
// Remove current element of inner loop
// Subtracting one as list size is reduced by 1
strArr.RemoveAt(j - 1);
//
i--;
break;
}
}
}
bool isRemoved = false;
// Loop for selecting combination of three elements at time
for (int i = 0; i < strArr.Count; i++)
{
for (int j = i + 1; j < strArr.Count; j++)
{
for (int k = j + 1; k < s.Count; k++)
{
// Writing on Console
// Actually do some operation to check whether these three elements in list needs to be removed or not
Console.Write(strArr[i] + strArr[j] + strArr[k]);
Console.WriteLine();
// Check whether current combination of 3 elements need to be removed or not
if (<< condition >>)
{
// Remove all the three elements
// Remove current element of outer loop
strArr.RemoveAt(i);
// Remove current element of inner loop
// Subtracting 1 as list size is reduced by 1
strArr.RemoveAt(j - 1);
// Subtracting 2 as list size is reduced by 2
strArr.RemoveAt(k - 2);
isRemoved = true;
i--;
break;
}
// If elements are removed then exit from loop with variable j
if (isRemoved)
{
break;
}
}
}
}
// Now make loop for selecting combination of four elements at time
// and keep removing the elements depending upon condition
要素を削除すると、パフォーマンスが向上するので、最後までこの操作を実行したいと思います。再帰的にループのこれらの深いレベルを維持する方法を考えることができません。再帰でこれらの無限のforループを追加するのを手伝ってくれる人はいますか?
ソリューションの作成に時間を割いていただきありがとうございますが、これは私が望んでいることではありません...コードなしで要件を簡単に説明します。
- 10個の要素のリストがあるとしましょう。
- 2から9までのすべての組み合わせを選択したい。要素の総数が10の場合、可能な組み合わせの総数は1012になります。
- 次に、2つのグループのすべての組み合わせの評価を開始します。最初のグループ(A、B)としましょう。特定の条件に基づいてこのグループを評価し、その組み合わせが条件をサスティファイする場合は、10個の要素のリストから要素(A、B)を削除します。したがって、リストに8つの要素を残します。
- 残りの8つの要素との組み合わせの総数は246になります。(A、C)(A、D)などの組み合わせは試していません。
- しかし、私はまだ2つのグループの組み合わせを評価しています。次に、2つのグループの残りの組み合わせを選択します...次の組み合わせは(C、D)(C、E)になります。残りのすべての組み合わせがそうではないとしましょう。リストからそれらを削除する条件を満たします。次に、3つのグループの組み合わせの評価を開始します。
- 3つの最初のグループは(C、D、E)になります...特定の条件に合格した場合、リストから3つの要素すべてを削除し、5つの要素のみを残します。次に、これら5つの要素で3の組み合わせのテストを実行します。
- その後、4人のグループなど
ユースケースを今すぐ理解していただければ幸いです。
上記のユースケースの実装を手伝ってくれる人はいますか?