2012-08-14 43 views
1


我是lambda表達式的新手;我正在通過實施它們來學習。我有一個關於如何將for循環轉換爲lambda表達式的問題。用於OR表達式連接的Lambda實現

EnumHelper.GetEnumFromString是一個幫助方法,它接受字符串描述並返回枚舉。


[Flags] 
    public enum Colors 
    { 
     [DescriptionAttribute("YL")] 
     Yellow = 1, 
     [DescriptionAttribute("RD")] 
     Red = 2, 
     [DescriptionAttribute("GR")] 
     Green = 4 
    } 

string colorStr = "GR,RD"; 
List<Colors> clrs = colorStr.Split(new char[] { ',' }).Select(p => EnumHelper.GetEnumFromString<Colors>(p)).ToList(); 
Colors currentValidColors = Colors.Green; 

    for (int i = 0; i < clrs .Count; i++) 
    { 
     if (i == 0) 
       currentValidColors = clrs [i]; 
      else 
       currentValidColors = currentValidColors | clrs [i]; 
    } 

+0

如果我理解你的權利,你所要求的LINQ溶液(lambda表達式只是創建匿名函數的方式) – elyashiv 2012-08-14 17:17:15

+0

不知道如果我的理解你的問題。您是否遇到當前代碼的問題,或者您想要對當前代碼進行不同的實現?爲了將字符串描述轉換爲Enums,你可以使用Enum.Parse()或Enum.TryParse() – 2012-08-14 17:19:30

+0

你會想看看'aggregate'擴展方法來將所有'Colors'聚合成一個'Colors'。在一個側面說明中,「Colors」實際上代表一種顏色,所以您應該相應地重命名它。 – Servy 2012-08-14 17:22:28

回答

1

這是你在想什麼? ForEach擴展方法僅適用於通用列表。

Colors currentValidColors = 0; 
colorStr.Split(new char[] { ',' }) 
.Select(p => EnumHelper.GetEnumFromString<Colors>(p)) 
.ToList() 
.ForEach(c => currentValidColors |= c); 
+0

是的,這是我正在尋找...但我聽說ForEach不返回任何東西。那是對的嗎? – Krishna 2012-08-14 17:28:16

+0

是的,它不會返回任何東西。我的抱歉是錯字。現在修復它。 currentValidColors的值在| = c語句中設置。 – loopedcode 2012-08-14 17:30:25

2

這種方式,可以conciser:

Colors currentValidColors = 
    colorStr.Split(',') 
      .Select(EnumHelper.GetEnumFromString<Colors>) 
      .Aggregate((a, b) => a | b);