2013-10-31 51 views
0

我想在組,語言和TestEnum的所有可能的組合上運行GetResults()。我如何使用lambda表達式重寫這段代碼以避免使用foreach循環?多個foreach循環的Lambda表達式

public enum TestEnum 
    { 
     ONE, 
     TWO, 
     THREE 
    } 

    public static void Test1() 
    { 
     List<string> groups = new List<string>() { "group1", "group2", "group3", "group4" }; 
     List<string> languages = new List<string>() { "EN-CA", "FR-CA" }; 
     List<string> results = new List<string>(); 

     foreach (string group in groups) 
     { 
      foreach (string language in languages) 
      { 
       foreach (TestEnum enumval in Enum.GetValues(typeof(TestEnum))) 
       { 
        results.Add(GetResult(group, language, enumval)); 
       } 
      } 
     } 

    } 
    public static string GetResult(string group, string language, TestEnum enumval) 
    { 
     return group + language + enumval.ToString(); 
    } 
+0

相反比調用'GetValues'然後得到字符串值,你可以使用'GetNames'(也就是說,除非你真正的代碼使用了實際值,而不僅僅是字符串表示)。 – Servy

+0

我建議使用Resharper的試用版,它會將它們轉換爲你,它幫助我快速學習 – Jonesopolis

回答

1

我傾向於lazyberezovsky同意,查詢語法更容易在這種情況下閱讀,但這裏有雲:

results = groups 
    .SelectMany(group => languages 
    .SelectMany(language => Enum.GetValues(typeof(TestEnum)) 
     .Cast<TestEnum>() 
      .Select(enumValue => GetResult(group, language, enumValue)))) 
    .ToList(); 

也許更好的壓痕或換行符會看起來更好......

+0

查詢語法更清晰,我在問題中的意圖是使用方法的語法,謝謝 – jimmyjambles

6

我覺得這裏的查詢語法比lambda表達式更好:

results = (from g in groups 
      from l in languages 
      from e in Enum.GetValues(typeof(TestEnum)).Cast<TestEnum>() 
      select g + l + e).ToList(); 

主要生產

group1EN-CAONE 
group1EN-CATWO 
group1EN-CATHREE 
group1FR-CAONE 
group1FR-CATWO 
group1FR-CATHREE 
group2EN-CAONE 
group2EN-CATWO 
group2EN-CATHREE 
etc 
+3

因爲它們編譯成相同的東西,所以我會說*更清晰*,而不是*更好*。但是,這在方法語法中會看起來很醜。 – Servy

+0

@Servy thnaks,是的,你是對的,*清潔*是適當的詞) –

+0

我同意以及查詢語法更清晰,我的意圖是使用方法語法,所以我去那個答案。 – jimmyjambles

2

希望這會解決你的問題:

var results = (
    from @group in groups 
    from language in languages 
    from TestEnum enumval in Enum.GetValues(typeof (TestEnum)) 
     select GetResult(@group, language, enumval)).ToList(); 

讓我知道如果你的需要一些解釋。