我正在寻找一个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