2011-03-08 46 views
2

我正在爲我的作業寫一個簡單的加密。我已經完成了它,現在我試圖用lambda表達式改進我的代碼。 lambda表達式後,列表中的對象不會更改。它是否使用局部變量?我怎樣才能用lambda表達式來做到這一點。我寫我的代碼如下賦值不會修改列表ForEach函數與lambda表達式中的變量

public override string Encrypt(string code) 
    { 
     List<Byte> encodedBytes = new List<Byte>(ASCIIEncoding.ASCII.GetBytes(code)); 

     encodedBytes.ForEach(o => { if (hash.Contains(o)) 
      o = hash.ElementAt((hash.IndexOf(o) + ShiftAmount) % hash.Count); });    

     return ASCIIEncoding.ASCII.GetString(encodedBytes.ToArray());     
    } 

我在等待你的回答,謝謝...

+0

什麼是'hash'的類型? – 2011-03-08 21:31:44

+0

在這種情況下,將Lambda表達式添加到代碼中並不會有太大改進。我認爲Lambda表達式實際上會降低基於可讀性的代碼質量。在這種情況下,標準的ForEach將更具表現力的IMO。 – 2011-03-08 21:38:55

+0

@Mark Byers:散列的類型是List,我試過HashSet,但它沒有我需要的IndexOf方法。 @Metro Smurf:謝謝你的建議你說的對,我很喜歡通過強制.NET功能:) – nepjua 2011-03-08 21:48:10

回答

0

如果你想要一個更相關的問題的解決方案,這將是更適合

public static class Extensions 
{ 
    public static void ModifyWhere<T>(this List<T> list, Func<T, bool> condition, Func<T, T> act) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 
      if (condition(list[i])) 
       list[i] = act(list[i]); 
     } 
    } 
} 

並且這個解決方案不是特定的,以bool返回函數作爲條件的方法,以及作爲動作返回函數。

樣例用法將是繼

mylist.ModifyWhere(someBoolReturningFunction, someTReturningFunction); 
2

它確實是使用局部變量。如果要將lambda的返回值分配回列表中,請使用ConvertAll而不是ForEach。

+0

感謝您的答案,但我必須確保散列包含元素之前,我將其轉換。 – nepjua 2011-03-08 21:46:28

+0

你可以在你的轉換表達式中做到這一點。 – 2011-03-08 21:57:12

+0

@nepjua沒有阻止你這樣做。 – 2011-03-08 23:45:39

0

是的,在你的代碼中,變量'o'是傳遞給ForEach方法的匿名方法範圍內的局部變量。對此的更改不會反映在該範圍之外。

0

你可以編寫自己的擴展方法來遍歷列表,修改項目,然後根據您的拉姆達這樣返回一個新的列表:

public static class Extensions 
{ 
    public static List<T> ModifyEach<T>(this List<T> list, Func<T, T> method) 
    { 
    List<T> mod = new List<T>(); 

    foreach (T e in list) 
    { 
     mod.Add(method(e)); 
    } 

    return mod; 
    } 
} 

使用範例:

List<string> f = new List<string>() 
{ 
    "hello", 
    "world" 
}; 

f = f.ModifyEach(x => x.ToUpper()); 
f.ForEach(x => Console.WriteLine(x)); 
+1

這就是我一直在尋找的。謝謝你的回答。現在我知道,我不知道寫那種東西。非常感謝。 – nepjua 2011-03-08 22:03:54