如何获得尊重订单的集合的所有子集

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

你可以递归地做。

将项目放在一个集合中,并创建一个包含子集中项目的空列表。 然后调用填充列表列表的递归方法。

在每个递归调用开始时,将您目前收集的项目添加到结果列表列表中。 然后,对于项目集中剩余的每个项目,执行以下操作:

  1. 从剩余的设置中删除该项目
  2. 将项添加到包含部分子集的列表中
  3. 进行递归调用
  4. 从部分子集中删除项目
  5. 将项目添加回剩余的集合。

这是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); } } 

演示。