C# - 从对象列表中获取定义长度(或更短)的所有组合

C# - Get all combinations of defined length (or less) from a list of objects

我有一个List<Object>。我有一个 int maxSize。我想要一个 List<List<Object>> 包含 maxSize 对象的所有组合(此列表是 maxSize,而不是对象),或更少。

我见过看起来像我的问题的解决方案,但它们不是我的问题,显然我的大脑不够聪明,无法解决。我也已经花了 3 天的时间来解决我的整体问题,试图将自己递归到遗忘中,所以我只是在寻找在那个时候才有效的解决方案。

要求:

我对这个问题的回答稍作修改:
Clean algorithm to generate all sets of the kind (0) to (0,1,2,3,4,5,6,7,8,9)

static IEnumerable<List<T>> Subsets<T>(List<T> objects, int maxLength) {
    if (objects == null || maxLength <= 0)
        yield break;
    var stack = new Stack<int>(maxLength);
    int i = 0;
    while (stack.Count > 0 || i < objects.Count) {
        if (i < objects.Count) {
            if (stack.Count == maxLength)
                i = stack.Pop() + 1;
            stack.Push(i++);
            yield return (from index in stack.Reverse()
                          select objects[index]).ToList();
        } else {
            i = stack.Pop() + 1;
            if (stack.Count > 0)
                i = stack.Pop() + 1;
        }
    }
}

用法示例:

var numbers = new List<int>{1,2,3,4,5};
foreach (var subset in Subsets(numbers, 3)) {
    Console.WriteLine(string.Join("", subset));
}

如果您需要 List<List<int>>,只需对结果调用 ToList()