как изменить объекты в Универсальном Списке с помощью foreach?

Get-ChildItem . -Include *.txt -Recurse | foreach {(Get-Content $_).Count}

Сжатый вниз немного с псевдонимами:

GCI . -Include *.txt -Recurse | foreach{(GC $_).Count}

Даст результаты, подобные этому:

Lines Words               Characters              Property
----- -----               ----------              --------
   21
   40
   29
   15
  294
   13
   13
  107

Править: Измененный для рекурсивного вызова через подпапки.

РЕДАКТИРОВАНИЕ 2: Удаленное использование Объекта Меры.

8
задан SilentGhost 7 June 2009 в 11:10
поделиться

2 ответа

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

Изменение значения list in-place, вероятно, будет иметь реальный foreach , но если вы счастливы получить новый список в результате, вы можете попробовать:

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

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

14
ответ дан 5 December 2019 в 07:13
поделиться

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

Причина в том, что List .ForEach вызывает делегат Action с подписью:

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);
9
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

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