如何获得尊重订单的集合的所有子集
我正在寻找一个C#示例,它会在尊重订单的同时为我提供一组的所有子集。
例如,我有A,B,并希望:
A B AB BA
请注意,为了我的目的, AB != BA
。
对于任何输入类型,解决方案应该是通用的:
List<List> GetSubsets(List originalSet)
我遇到了一些使用按位操作AB == BA的很好的解决方案(例如,为字符串列表生成所有组合 ),但到目前为止,我找不到任何解决上述内容的方法。
任何提示/指针将不胜感激!
GetPermutations()是参考。 来自https://stackoverflow.com/a/10630026/1287352
public static List> PermutationOf(HashSet set) { var result = new List>(); for (var length = 1; length <= set.Count; length++) { result.AddRange(GetPermutations (set, length).Select(i => i.ToList())); } return result; } private static IEnumerable> GetPermutations (IEnumerable 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.NewGuid(), Guid.NewGuid(), Guid.NewGuid() }) PermutationOf(new HashSet() { "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
你可以递归地做。
将项目放在一个集合中,并创建一个包含子集中项目的空列表。 然后调用填充列表列表的递归方法。
在每个递归调用开始时,将您目前收集的项目添加到结果列表列表中。 然后,对于项目集中剩余的每个项目,执行以下操作:
- 从剩余的设置中删除该项目
- 将项添加到包含部分子集的列表中
- 进行递归调用
- 从部分子集中删除项目
- 将项目添加回剩余的集合。
这是C#中的一个简单实现:
static void CollectAll(ISet remaining, IList soFar, List> all) { if (soFar.Count != 0) { all.Add(soFar.ToList()); } foreach (var item in remaining.ToList()) { remaining.Remove(item); soFar.Add(item); CollectAll(remaining, soFar, all); soFar.Remove(item); remaining.Add(item); } }
演示。