Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能得到一个集合的所有子集,这些子集都遵循顺序_C#_Algorithm_Subset - Fatal编程技术网

C# 我怎样才能得到一个集合的所有子集,这些子集都遵循顺序

C# 我怎样才能得到一个集合的所有子集,这些子集都遵循顺序,c#,algorithm,subset,C#,Algorithm,Subset,我正在寻找一个C#示例,它将给出集合的所有子集,同时尊重顺序 例如,我有A、B,我想: A B AB BA 请注意,出于我的目的,AB!=BA 对于任何输入类型,解决方案都应该是通用的: List<List<T>> GetSubsets<T>(List<T> originalSet) List getsubset(List originalSet) 我遇到了一些很棒的解决方案,它们使用了AB==BA(例如)的逐位操作,但到目前为止,我还没有找

我正在寻找一个C#示例,它将给出集合的所有子集,同时尊重顺序

例如,我有A、B,我想:

A
B
AB
BA
请注意,出于我的目的,
AB!=BA

对于任何输入类型,解决方案都应该是通用的:

List<List<T>> GetSubsets<T>(List<T> originalSet)
List getsubset(List originalSet)
我遇到了一些很棒的解决方案,它们使用了AB==BA(例如)的逐位操作,但到目前为止,我还没有找到任何解决上述问题的方法


如有任何提示,将不胜感激

你可以递归地做

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

在每次递归调用中,首先将迄今为止收集的项添加到结果列表中。然后对项目集中剩余的每个项目执行以下操作:

  • 从其余集合中删除该项目
  • 将项目添加到包含部分子集的列表中
  • 进行递归调用
  • 从部分子集中删除该项
  • 将项目添加回剩余的集合
  • 下面是一个简单的C#实现:

    static void CollectAll(剩余ISet、剩余IList、全部列出){
    如果(soFar.Count!=0){
    all.Add(soFar.ToList());
    }
    foreach(剩余.ToList()中的var项){
    剩余。移除(项目);
    添加(项目);
    集合所有(剩余、soFar、全部);
    移除(项目)的表面;
    剩余。添加(项目);
    }
    }
    

    GetPermutations()是来自


    找到所有的子集,然后找到它们的所有排列。我认为你的问题陈述是反向的。你要尊重秩序,而不是无视它。你是对的,雷蒙德!
    static void CollectAll(ISet<String> remaining, IList<string> soFar, List<List<string>> 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);
        }
    }
    
    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