2015-07-04 19 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? –