2015-07-04 18 views

回答

0

使用Tuple,手動我害怕。所以:

var tuple = new Tuple<string, string, string>("a", "b", "c"); 
var combination_1 = String.Concat(tuple.Item1, tuple.Item2, tuple.Item3); 
var combination_2 = String.Concat(tuple.Item1, tuple.Item3, tuple.Item2); 
var combination_3 = String.Concat(tuple.Item2, tuple.Item1, tuple.Item3); 
var combination_4 = String.Concat(tuple.Item2, tuple.Item3, tuple.Item1); 
var combination_5 = String.Concat(tuple.Item3, tuple.Item1, tuple.Item2); 
var combination_6 = String.Concat(tuple.Item3, tuple.Item2, tuple.Item1); 

使用修改埃裏克Liperts擴展方法,你可以做這樣的事情:

擴展方法:

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
{ 
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 

    return sequences.Aggregate 
     (emptyProduct, (accumulator, sequence) => 
      from accseq in accumulator 
      from item in sequence 
      where !accseq.Contains(item) 
      select accseq.Concat(new[] { item }) 
     ); 
} 

使用案例:

var array = new string[] { "a", "b", "c", "d", "e" }; 
var result = Enumerable.Range(0, array.Length).Select(_ => array).CartesianProduct(); 

// Print results 
foreach (var item in result) 
    Console.WriteLine(String.Join("", item)); 

如果喲ü以往任何時候都希望得到所有排列包括「AAA」「AAB」等簡單地從擴展方法去除

where !accseq.Contains(item)

+0

也是這樣:'string [] stringArray = {tuple.Item1,tuple.Item2,... tuple.ItemN};'(首先解開tuple對象) –

+0

@AndrejsIgumenovs是的,沒錯。您可以將項目從元組中移出到數組中並使用相同的擴展方法。 – msmolcic

2

因爲"6"是一個非常小的數字,它是最有效的,只是把它寫下來:

tupple1 = a,b,c 
tupple2 = a,c,b 
... 

您不能在較短的時間內創建一個程序。

如果你有興趣在一個更GENRAL解決方案然而,看到很多環節之一的SO,例如:Permutation algorithms in C#

+0

那麼,如果我有一個'字符串d',那麼數字就是24. –

+1

那麼,這是一個不同的問題 – DrKoch

+0

應該那我用LINQ? –