用于生成没有linq的组合的递归算法

时间:2015-05-07 18:06:35

标签: c# algorithm linq recursion combinations

有没有办法将以下代码段转换为循环而不是使用大量LINQ?

public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
    return k == 0
       ? new[] {new T[0]}
       : elements.SelectMany((e, i) =>
             elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] {e}).Concat(c)));
}

目标是提出给定元素列表的大小k的所有可能组合。

1 个答案:

答案 0 :(得分:0)

这是我对此的第一次看法

    public static IEnumerable<IEnumerable<int>> Combs(List<int> e, int size)
    {
            for (int i=0; i< e.Count; i ++)
            {                
                if (size  == 1)                    
                    yield return new[] {e[i]};

                foreach ( var next in Combs(e.GetRange(i + 1, e.Count - (i + 1)), size  - 1) )
                    yield return new[] { e[i] }.Concat(next);
            }      
    }

但是,如果可能的话,我想简化foreach语句,可能还有concat参数......