c#从列表中获取可能的DISTINCT组合

本文关键字:DISTINCT 组合 获取 列表 | 更新日期: 2023-09-27 18:03:32

可能已经有答案了,我只是用错误的术语搜索。如果是这样的话,我很抱歉,如果确实有的话,请您给我指出现有的答案。

我需要的是能够获取一个列表并从该列表中产生所有可能的不同组合。我所说的不同是指相同的组合不应该以不同的顺序出现。

下面是一个例子:假设我有一个值为"One"Two"answers"Three"的列表,那么我希望输出为="One","Two","Three","One, Two","One Two Three"

我对"blank"组合不感兴趣,我不想在多个顺序中返回相同的组合。我发现并试图为我工作的大多数代码都有一个主要缺陷,即它将返回所有可能性,包括"二三"answers"三二",这在我的情况下是错误的。

我目前正在努力适应的代码是来自另一个SO问题(值列表的所有可能组合),看起来像这样:

  public void GetCombination(System.Collections.Generic.List<string> list)
    {
        Combinations = new List<string>();
        double count = System.Math.Pow(2, list.Count);
        for (int i = 1; i <= count - 1; i++)
        {
            string str = Convert.ToString(i, 2).PadLeft(list.Count, '0');
            for (int j = 0; j < str.Length; j++)
            {
                if (str[j] == '1')
                {
                    Combinations.Add(list[j]);
                }
            }
            ///Combinations = found;
        }
    }

不幸的是,当涉及到c#时,我是一个新手,我诚实地只使用它,因为一个同事提到它可能比我目前的powershell脚本要快得多,它完成了我正在寻找的…但这需要很长时间。

提前感谢您的建议!

c#从列表中获取可能的DISTINCT组合

下面是使用Martin Smith提到的幂集答案的代码实现:

class Program {
    static void Main(string[] args) {
        // find all possible combinations of this list
        var input = new [] {"One", "Two", "Three"};
        var output = FastPowerSet(input);
        Print(output);
        Console.ReadLine();
    }
    static T[][] FastPowerSet<T>(T[] seq) {
        var powerSet = new T[1 << seq.Length][];
        powerSet[0] = new T[0]; // starting only with empty set
        for (var i = 0; i < seq.Length; i++) {
            var cur = seq[i];
            var count = 1 << i; // doubling list each time
            for (var j = 0; j < count; j++) {
                var source = powerSet[j];
                var destination = powerSet[count + j] = new T[source.Length + 1];
                for (var q = 0; q < source.Length; q++)
                    destination[q] = source[q];
                destination[source.Length] = cur;
            }
        }
        return powerSet;
    }
    static void Print<T>(T[][] seq) {
        for (var i = 0; i < seq.Length; i++) {
            var line = new StringBuilder();
            for (var j = 0; j < seq[i].Length; j++ ) {
                line.AppendFormat("{0}, ", seq[i][j]);
            }
            Console.WriteLine(line);
        }
    }
}