我有一个列表,我想从 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 人之后,依此类推
我希望您现在了解用例。
任何人都可以帮助我实施上述用例吗?