列表的所有排列

时间:2013-03-01 03:44:52

标签: c# combinations

我希望能够像这样列出

var list=new List<int>{0, 1, 2};

得到这样的结果

var result=
    new List<List<int>>{
        new List<int>{0, 1, 2},
        new List<int>{0, 2, 1},
        new List<int>{1, 0, 2},
        new List<int>{1, 2, 0},
        new List<int>{2, 0, 1},
        new List<int>{2, 1, 0}
    };

我对缺少数字的集合感兴趣,只是存在数字的组合。有什么想法吗?


此外,我已经研究过像Getting all possible combinations from a list of numbers这样的解决方案,但它们并不合适。

那个给我这样的东西

var result=
    new List<List<int>> {
        // [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
        // serialized the result to JSON so it would be quicker.
    };

并没有吐出所有的组合。


1 个答案:

答案 0 :(得分:9)

尝试使用这些扩展方法的大小:

public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> sequence)
{
    if (sequence == null)
    {
        yield break;
    }

    var list = sequence.ToList();

    if (!list.Any())
    {
        yield return Enumerable.Empty<T>();
    }
    else
    {
        var startingElementIndex = 0;

        foreach (var startingElement in list)
        {
            var remainingItems = list.Where((e,i) => i != startingElementIndex);

            foreach (var permutationOfRemainder in remainingItems.Permute())
            {
                yield return startingElement.Concat(permutationOfRemainder);
            }

            startingElementIndex++;
        }
    }
}

private static IEnumerable<T> Concat<T>(this T firstElement, IEnumerable<T> secondSequence)
{
    yield return firstElement;
    if (secondSequence == null)
    {
        yield break;
    }

    foreach (var item in secondSequence)
    {
        yield return item;
    }
}