присваивание не изменяет переменную в функции List ForEach с лямбда-выражением - PullRequest
2 голосов
/ 09 марта 2011

Я пишу простое шифрование для домашней работы.Я закончил, теперь я пытаюсь улучшить свой код с помощью лямбда-выражений.Объект в списке не меняется после лямбда-выражения.Используется ли локальная переменная?И как я могу сделать это с лямбда-выражением.Я написал свой код следующим образом

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 ]

2 голосов
/ 09 марта 2011

Это действительно использует локальную переменную. Если вы хотите, чтобы возвращаемое значение лямбда-индекса было назначено обратно в список, используйте ConvertAll вместо ForEach.

0 голосов
/ 10 марта 2011

Если вы хотите более решение проблемы, это будет более подходящим

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);
0 голосов
/ 09 марта 2011

Вы можете написать свой собственный метод расширения для перебора вашего списка, изменения элементов и последующего возврата нового списка на основе вашей лямбды, например:

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));
0 голосов
/ 09 марта 2011

Да, в вашем коде переменная 'o' является локальной переменной в области действия анонимного метода, переданного методу ForEach.Изменения к нему не будут отражены за пределами этой области.

...