赋值不会使用lambda表达式修改List ForEach函数中的变量

时间:2011-03-08 21:25:08

标签: c# variables lambda variable-assignment

我正在为我的作业写一个简单的加密。我已经完成了,现在我正在尝试使用lambda表达式来改进我的代码。 lambda表达式后,列表中的对象不会更改。它是否使用局部变量?我怎么能用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());                
    }

我在等你的回答,谢谢...

4 个答案:

答案 0 :(得分:2)

确实使用了局部变量。如果您希望将lambda的返回值分配回列表,请使用ConvertAll而不是ForEach。

答案 1 :(得分:0)

是的,在您的代码中,变量“o”是传递给ForEach方法的匿名方法范围内的局部变量。对它的更改不会反映在该范围之外。

答案 2 :(得分:0)

您可以编写自己的扩展方法来迭代列表,修改项目,然后根据您的lambda返回一个新列表,如下所示:

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));

答案 3 :(得分: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);