LINQ声明中的N-Enumerables?

Rob*_* P. 5 c# linq combinations

可能重复:
生成所有可能的组合

我不确定如何说出这个问题; 但我正在研究一个愚蠢的逻辑谜题,我能够使用LINQ语句解决.相关代码如下所示:

(from myA in Enumerable.Range(1, 40)
 from myB in Enumerable.Range(1, 40)
 from myC in Enumerable.Range(1, 40)
 from myD in Enumerable.Range(1, 40)
 where myA + myB + myC + myD == 40
    && myA <= myB
    && myB <= myC
    && myC <= myD
 select new[] {myA, myB, myC, myD})
Run Code Online (Sandbox Code Playgroud)

所以它基本上生成满足Where子句中标准的A,B,CD的所有组合.

我现在要做的就是概括这一点,所以我可以用N值而不是四个来做同样的事情.例如,使用3个值 - 等效代码将是:

(from myA in Enumerable.Range(1, 40)
 from myB in Enumerable.Range(1, 40)
 from myC in Enumerable.Range(1, 40)
 where myA + myB + myC == 40
    && myA <= myB
    && myB <= myC
 select new[] {myA, myB, myC})
Run Code Online (Sandbox Code Playgroud)

当然,我不想修改代码 - 我想要一个我可以调用的函数并提供一个整数并让它返回正确的对象.

我做了一些误入歧途的尝试; 但我真的看不出怎么做那样的事.有人能指出我正确的方向吗?

use*_*188 0

还没有阅读链接,我不确定这是否是正确的方法,但为什么不想象我们正在遍历一棵深度为 n 的树,每个节点都有 40 个(或示例中的 20 个)子节点?那么它会看起来像这样:

class Program {
    static void Main(string[] args) {
        Walk(3).Where(l => l.Sum() == 20 &&
            l.Skip(1).Where((num, i) => num < l[i]).Count() == 0)
        .ToList().ForEach(l => Console.WriteLine(string.Join(" ", l)));
        Console.ReadLine();
    }

    static IEnumerable<List<int>> Walk(int depth) {
        return depth == 0 ? 
            new[] { new List<int>()} :
            Enumerable.Range(1,20).SelectMany(i =>
                Walk(depth - 1).Select(l => l.Concat(new[] {i}).ToList()));
    }
}
Run Code Online (Sandbox Code Playgroud)