2016-01-24 180 views
3

所以我有一個方法需要一個字符串。該字符串由一個常量值和2個bools,2個常量int以及一個可以爲10,20或30的int組成。這將全部是一個字符串,其中參數由下劃線分隔。C#使用所有可能的組合創建字符串

例子:

string value = "horse" 
string combination1 = value+"_true_false_1_1_20"; 
dostuff(combination1); 

我需要通過

運行每一個可能的組合如何利用這個恆定值,並通過該方法以所有可能的組合的運行呢?

字符串建:「VALUE_BOOL1_BOOL2_CONSTINT1_CONSTINT2_INT1」

Possibilities 
    VALUE = Horse 
    BOOL1 = True, False 
    BOOL2 = True, False 
    CONSTINT1 = 1 
    CONSTINT2 = 1, 
    INT1 = 10, 20, 30 

我如何可以採取預先定義的字符串值,並創造一切可能的組合,並通過doStuff(字符串組合)方法運行它們?

+0

嘗試閱讀有關循環:https://msdn.microsoft.com/en-us/library/f0e10e56%28v=vs.90%29.aspx – pseudoDust

回答

4

你可以用一個非常可讀的LINQ語句做到這一點,而無需使用循環:

public static List<String> Combis(string value) 
{ 
    var combis = 
    from bool1 in new bool[] {true, false} 
    from bool2 in new bool[] {true, false} 
    let i1 = 1 
    let i2 = 1 
    from i3 in new int[] {10, 20, 30} 
    select value + "_" + bool1 + "_" + bool2 + "_" + i1 + "_" + i2 + "_" + i3; 

    return combis.ToList(); 
} 

編輯:請記住,多個陣列有因爲the in-clause is evaluated multiple times上述方案被創建。你可以將其更改爲以下來規避這樣的:

public static List<String> Combis(string value) 
{ 
    bool[] bools = new[] {true, false}; 
    int[] ints = new[] {10, 20, 30}; 

    var combis = 
     from bool1 in bools 
     from bool2 in bools 
     let i1 = 1 
     let i2 = 1 
     from i3 in ints 
     select value + "_" + bool1 + "_" + bool2 + "_" + i1 + "_" + i2 + "_" + i3; 

    return combis.ToList(); 
} 
+0

別客氣。可能你也應該留意我的[後續問題](http://stackoverflow.com/questions/34975128/how-often-is-the-in-clause-evaluated-in-a-linq-query)其中討論了這種方法的性能。 –

相關問題