获取arrays中的所有组合

说我有以下数组:

var arr = new[] { "A", "B", "C" }; 

如何生成仅包含两个字符且不包含两个字符的所有可能组合(例如ABBA相同)。 例如,使用上面的数组会产生:

 AB AC BC 

请注意,此示例已简化。 数组和所需字符串的长度将更大。

如果有人可以提供帮助,我真的很感激。

让我们扩展它,所以也许我们可以看到模式:

 string[] arr = new string[] { "A", "B", "C", "D", "E" }; //arr[0] + arr[1] = AB //arr[0] + arr[2] = AC //arr[0] + arr[3] = AD //arr[0] + arr[4] = AE //arr[1] + arr[2] = BC //arr[1] + arr[3] = BD //arr[1] + arr[4] = BE //arr[2] + arr[3] = CD //arr[2] + arr[4] = CE //arr[3] + arr[4] = DE 

我在这里看到两个循环。

  • 第一个(外部)循环从0到3(arr.Length – 1)
  • 第二个(内部)循环从外循环计数器+ 1到4(arr.Length)

现在应该很容易将其转换为代码!

由于排序无关紧要,因此这些实际上是组合而非排列。 在任何情况下,这里都有一些示例代码(您需要标题为“组合(即没有重复)”的部分)。

你要求的是组合,而不是排列(后一个术语暗示顺序很重要)。 无论如何,它是递归的经典用法。 在伪代码中:

 def combs(thearray, arraylen, currentindex, comblen): # none if there aren't at least comblen items left, # or comblen has gone <= 0 if comblen > arraylen - currentindex or comblen <= 0: return # just 1 if there exactly comblen items left if comblen == arraylen - currentindex: yield thearray[currentindex:] return # else, all combs with the current item...: for acomb in combs(thearray, arraylen, currentindex+1, comblen-1): yield thearray[currentindex] + acomb # ...plus all combs without it: for acomb in combs(thearray, arraylen, currentindex+1, comblen): yield acomb 
 public string[] Permute(char[] characters) { List strings = new List(); for (int i = 0; i < characters.Length; i++) { for (int j = i + 1; j < characters.Length; j++) { strings.Add(new String(new char[] { characters[i], characters[j] })); } } return strings.ToArray(); } 

它是1到n-1或n(n-1)/ 2的总和。

 int num = n * ( n - 1 ) / 2; 

显然你可以使用一对因子来推广n *(n – 1),无论你想做什么(字符串大小明智)。

没有经过测试而且速度最快,但是:

 IEnumerable Combine(String text, IEnumerable strings) { return strings.Select(s => text + s).Concat(Combine(strins.Take(1).First(), strings.Skip(1)) } 

呼叫:

 foreach (var s in Combine("" , arrayOfStrings)) { // print s } 

写了一个问题的答案,结果certificate是重复的,指向这里。

 var arr = new[] { "A", "B", "C" }; var arr2 = arr1.SelectMany( x => arr1.Select( y => x + y)); 

在VS2013中枚举到控制台时生成正确的输出。 SelectMany将展平从内部Select生成的内部IEnumerable

您正在寻找的是沿着以下伪代码行的双循环。

 for(int i = FirstElement; i<= LastElement; increment i) { for(j = i; j<= lastElement; increment j) { if(i != j) { print (i, j) } } }