2015-07-19 3 views
2

Возможно, у вас уже есть ответ, и я просто ищу неправильные термины. Прошу прощения, если это так, и попросите, чтобы вы указали мне на существующий ответ, если там действительно есть.C# получить возможные комбинации DISTINCT из списка

Мне нужно, чтобы иметь возможность принимать список и производить все возможные отдельные комбинации из этого списка. Я имею в виду, что разные комбинации не должны отображаться в разных порядках.

Пример: Скажем, у меня есть список со значениями «Один», «Два» и «Три», тогда я хотел бы, чтобы результат был = «Один», «Два», «Три», «Один» «Два тройки», «Одна тройка»

У меня нет интереса к «пустой» комбинации, и я не хочу возвращать ту же комбинацию в несколько порядков. Большая часть кода, который я нашел и пыталась сделать для меня, имеет главный недостаток, что он вернет ВСЕ возможности, которые включают «Два три» и «Три два», что в моем случае неверно.

Кода я в настоящее время работаю, чтобы адаптироваться из другого SO вопроса (All Possible Combinations of a list of Values) и выглядит следующим образом:

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, который выполняет то, что я ищу ... Но для этого требуется очень много времени.

Заранее благодарим за консультацию!

+0

Вы никогда не задавали вопрос, какова проблема, которую вы имеете. –

+0

Текущий код не возвращает правильный результат ... Вопрос будет, как можно было бы найти отдельные комбо с использованием C#? – Ethan

ответ

2

Вот реализация кода с использованием the power sets answer Мартин Смит отметил:

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); 
     } 
    } 
} 
+0

Ты качаешься, я думаю, это будет работать отлично. Большое спасибо! – Ethan

Смежные вопросы