10

このようなリストを取得できるようにしたいと思います

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}
    };

数が欠落しているセットには興味がありません。存在する数の組み合わせだけです。何か案は?


また、すでに数字のリストからすべての可能な組み合わせを取得するなどのソリューションを検討しましたが、それらは適合しません。

それは私にこのようなものを与えます

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.
    };

そして、すべての組み合わせを吐き出すわけではありません。


4

1 に答える 1

13

サイズについては、次の拡張メソッドを試してください。

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 index = startingElementIndex;
            var remainingItems = list.Where((e, i) => i != index);

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

            startingElementIndex++;
        }
    }
}
于 2013-03-01T04:28:30.873 に答える