我正在寻找一个C#的例子,将给我一个集合的所有子集,同时尊重顺序。
例如,我有A、B,希望:

A
B
AB
BA

请注意,为了我的目的。
对于任何输入类型,解决方案都应该是通用的:
List<List<T>> GetSubsets<T>(List<T> originalSet)

我发现了一些很好的解决方案,使用了ab==ba(例如Generate all combinations for a list of strings)的按位操作,但是到目前为止,我还没有找到任何东西来解决我上面描述的问题。
任何提示/建议都将不胜感激!

最佳答案

GetPermutations()是从https://stackoverflow.com/a/10630026/1287352引用的

public static List<List<T>> PermutationOf<T>(HashSet<T> set)
{
    var result = new List<List<T>>();
    for (var length = 1; length <= set.Count; length++)
    {
        result.AddRange(GetPermutations<T>(set, length).Select(i => i.ToList()));
    }
    return result;
}

private static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[] { t });

    return GetPermutations(list, length - 1)
        .SelectMany(t => list.Where(e => !t.Contains(e)),
        (t1, t2) => t1.Concat(new T[] { t2 }));
}

用法:
PermutationOf(new HashSet<Guid>() { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() })
PermutationOf(new HashSet<String>() { "A", "B", "C" })

结果:
A
B
C
A, B
A, C
B, A
B, C
C, A
C, B
A, B, C
A, C, B
B, A, C
B, C, A
C, A, B
C, B, A

10-04 20:22