2009-06-07 4 views
8

У меня есть следующий общий список, который заполняется со списком строку:Как изменить элементы в общем списке с помощью foreach?

List<string> mylist =new List<string>(); 
myList.add("string1"); 
myList.add("string2"); 

сказать, что я хочу добавить «тест» в конце каждой строки, как я могу это сделать простым способом? Наглядно, я попытался это, который компилирует нормально:

myList.ForEach(s => s = s + "test"); 

Но если я тогда смотрю на содержание списка, ничего не изменилось. Я предполагаю, что я мог бы использовать цикл for для итерации по списку, но я ищу что-то очень простое и используя ForEach выглядит очень аккуратно ... но, похоже, не работает. Есть идеи?

ответ

14

Проблема в том, что Action вы указали исполняются на элементах список, но результат не возвращается нигде ... ваш s является локальной переменной.

Изменение списка в месте, вероятно, принять фактическую foreach, но если вы счастливы принять новый список, как результат, вы можете попробовать:

list = list.ConvertAll(s => s + "test"); 

Не совсем то же самое ... но как только вы получите ...

+1

В качестве альтернативы IEnumerable .Выберите (s => s + "test") ... –

9

Это невозможно сделать, если только тип списка не является изменяемым ссылочным типом (и в этом случае вы не можете изменить фактическую ссылку в списке, кроме самого объекта).

Причина заключается в том, что называет Action<T> делегат с подписью:

delegate void Action<T>(T obj); 

и здесь, аргумент передается по значению (это не ref). Как и любой метод, вы не можете изменить входной аргумент при вызове по значению:

Код по существу эквивалентно:

void anonymous_method(string s) { 
    s = s + "test"; // no way to change the original `s` inside this method. 
} 

list.ForEach(anonymous_method); 
+0

Спасибо за объяснение. Очень полезно. – Anthony

+1

Я также благодарю вас за объяснение ... Это самое простое объяснение, которое я видел ... бьет все что угодно и все на MSDN. Ta. – corlettk

+0

Да, мне нравится этот ответ, гораздо более чистый и интуитивно понятный – Vincent

 Смежные вопросы

  • Нет связанных вопросов^_^