我需要一种方法来生成C#列表中元素的所有组合(非排列)(非重复,顺序无关紧要)。
我已经看到了几个建议使用递归的解决方案,但是它们需要在返回之前构建整个列表(内存效率低下)。
我希望有一种方法可以创建一个可以产生当前组合的生成器,而不会在迭代期间存储所有其他组合。有谁知道任何有效的解决方案?
答案 0 :(得分:0)
使用yield return创建一个迭代器方法,如下所示:
public class Combinations: IEnumerable<Combination> {
public IEnumerator<T> GetEnumerator()
{
Combination currentCombination = Combination.FirstCombination();
while (currentCombination.IsValid()) {
yield return currentCombination;
currentCombination = currentCombination.NextCombination(); // return invalid combo if currentCombination is the last possible combination
}
}
}
当然你仍然需要编写Combination类,但这应该相对简单。您应该能够从当前组合生成下一个组合。例如,假设列表中有N个元素,您只需要增加一个包含N位数的基数N,当您这样做时,您将生成所有组合。
答案 1 :(得分:0)
有M = 2^n - 1
种可能的组合(如果我们排除空组合)。因此,只需在1..2 ^ n-1范围内进行for循环,并将循环计数器值映射到项目组合 - 如果设置了第k位,则组合使用第k项。例如,5=101binary
对应于组合(item[0], item[2])