У меня есть список как:
List<String> test = new List<String> {"Luke", "Leia"};
Я хотел бы использовать что-то вроде этого:
test.Select(s => String.Format("Hello {0}", s));
но это не корректирует имена в списке. Существует ли способ использовать лямбда-выражения для изменения их? Или это, потому что строки неизменны, что это не работает?
Select не изменяет оригинальную коллекцию; он создает новую IEnumerable
List<String> test2 = test.Select(s => String.Format("Hello {0}", s)).ToList();
test по-прежнему содержит "Luke" и "Leia", а test2 содержит "Hello Luke" и "Hello Leia".
Если вы хотите изменить исходный список с помощью выражения лямбда, вы можете применить выражение лямбда к каждому элементу списка в отдельности и сохранить результат обратно в коллекцию:
Func<string, string> f = s => String.Format("Hello {0}", s);
for (int i = 0; i < test.Count; i++)
{
test[i] = f(test[i]);
}
Здесь:
for(int i = 0; i < test.Count; i++) {
test[i] = String.Format("Hello {0}", test[i]);
}
Не нужно выдумывать. Не нужно злоупотреблять LINQ. Просто сделайте это просто.
Вы можете пойти на один шаг дальше и создать метод расширения так:
static class ListExtensions {
public static void AlterList<T>(this List<T> list, Func<T, T> selector) {
for(int index = 0; index < list.Count; index++) {
list[index] = selector(list[index]);
}
}
}
Использование:
test.AlterList(s => String.Format("Hello {0}", s));
Select
предназначено для проектирования и на самом деле предназначено для использования в условиях, где нет побочных эффектов. Манипулирование элементами списка очень наглядно имеет побочные эффекты. На самом деле, строка
test.Select(s => String.Format("Hello {0}", s));
ничего не делает, кроме создания IEnumerable
, которая в конечном итоге может быть перечислена для создания проекции.
Вы можете просто сделать утверждение фораха:
test.ForEach(s=>String.Format("Hello {0}", s));
Это если вы пытаетесь просто обновить имена.
Еще одно возможное решение:
List<String> test = new List<String> {"Luke", "Leia"};
List<string> FormattedStrings = new List<string>();
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal)));