Лямбда-выражение, как выполнить Строку. Формат в Списке <Строка>?

У меня есть список как:

List<String> test = new List<String> {"Luke", "Leia"};

Я хотел бы использовать что-то вроде этого:

test.Select(s => String.Format("Hello {0}", s));

но это не корректирует имена в списке. Существует ли способ использовать лямбда-выражения для изменения их? Или это, потому что строки неизменны, что это не работает?

5
задан Nyla Pareska 30 December 2009 в 14:36
поделиться

4 ответа

Select не изменяет оригинальную коллекцию; он создает новую IEnumerable, которую можно перечислить с помощью foreach или преобразовать в список:

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]);
}
12
ответ дан 18 December 2019 в 14:47
поделиться

Здесь:

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, которая в конечном итоге может быть перечислена для создания проекции.

.
3
ответ дан 18 December 2019 в 14:47
поделиться

Вы можете просто сделать утверждение фораха:

test.ForEach(s=>String.Format("Hello {0}", s));

Это если вы пытаетесь просто обновить имена.

-2
ответ дан 18 December 2019 в 14:47
поделиться

Еще одно возможное решение:

List<String> test = new List<String> {"Luke", "Leia"};
List<string> FormattedStrings = new List<string>();
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal)));
0
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: