C# 用LINQ生成数字序列

C# 用LINQ生成数字序列,c#,linq,C#,Linq,我试着写一个LINQ语句,它返回我所有可能的数字组合(我需要这个用于测试,我受到了启发)。我调用的方法原型如下所示: IEnumerable<Collection<int>> AllSequences( int start, int end, int size ); 现在,不知何故,我真的希望看到一个纯LINQ解决方案。我可以自己编写一个非LINQ解决方案,因此请在没有LINQ的解决方案中不遗余力。 到目前为止,我的尝试在一个点上结束,我必须将一个数字与我的方法的递归调

我试着写一个LINQ语句,它返回我所有可能的数字组合(我需要这个用于测试,我受到了启发)。我调用的方法原型如下所示:

IEnumerable<Collection<int>> AllSequences( int start, int end, int size );
现在,不知何故,我真的希望看到一个纯LINQ解决方案。我可以自己编写一个非LINQ解决方案,因此请在没有LINQ的解决方案中不遗余力。
到目前为止,我的尝试在一个点上结束,我必须将一个数字与我的方法的递归调用的结果连接起来-类似于:

return from i in Enumerable.Range( start, end - size + 1 )
       select BuildCollection(i, AllSequences( i, end, size -1));

但我无法在LINQ基础上实现
BuildCollection()
,甚至无法跳过此方法调用。你能帮我一下吗?

我想下面这样的东西应该可以做这项工作

public static IEnumerable<IEnumerable<int>> AllSequences(int start, int end,
    int size)
{
    return size <= 0 ? new[] { new int[0] } :
           from i in Enumerable.Range(start, end - size - start + 2)
           from seq in AllSequences(i + 1, end, size - 1)
           select Enumerable.Concat(new[] { i }, seq);
}
也许不是计算组合的最有效的方法,但肯定是相当紧凑的代码

我想我知道了

IEnumerable<List<int>> AllSequences(int start, int end, int size)
{
    if (size == 0)
        return Enumerable.Repeat<List<int>>(new List<int>(), 1);

    return from i in Enumerable.Range(start, end - size - start + 2)
           from seq in AllSequences(i + 1, end, size - 1)
           select new List<int>{i}.Concat(seq).ToList();
}
IEnumerable所有序列(int开始、int结束、int大小)
{
如果(大小==0)
返回可枚举的。重复(新列表(),1);
从可枚举范围中的i返回(开始,结束-大小-开始+2)
从所有序列中的序列(i+1,结束,大小-1)
选择新列表{i}.Concat(seq.ToList();
}

我刚刚运行了它,它导致了堆栈溢出:-(,可能是where size>0,就在第二个from之前?它需要是所有序列中的
from seq(I+1,end,size-1)
除此之外,很好!我也写了一个,但你的更简洁。+1这两个和@Fede的答案都没有结果:-(@David Archer try var result=Allsequences(1,5,3).ToList();@jonas,运气不好,但def没有评分,这很有趣:-)+1@Noldorin,@Fede:谢谢你的回答-我一定要仔细看看
可枚举的方法(比如
Repeat()
Concat()
)没有回答这个问题,但对我很有用,那么+1这有什么用呢?
。选择
不是多余的吗?@MateenUlhaq是的,似乎没有必要。从审阅队列中:我可以请求您在源代码周围添加一些上下文。只有代码的答案很难理解。如果您可以在您的帖子中添加更多信息。不回答问题,但回答谷歌搜索。
如果(size==0)返回新的int[]{}.ToList()
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IList<T> source,
    int num)
{
    return AllSequences(0, source.Count - 1, num).Select(
        seq => seq.Select(i => source[i]));
}
IEnumerable<List<int>> AllSequences(int start, int end, int size)
{
    if (size == 0)
        return Enumerable.Repeat<List<int>>(new List<int>(), 1);

    return from i in Enumerable.Range(start, end - size - start + 2)
           from seq in AllSequences(i + 1, end, size - 1)
           select new List<int>{i}.Concat(seq).ToList();
}
 Enumerable.Range(1, 12)
           .Select(x => (x - 1) + 1);