Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > При переборе массива не дает менять элементы


Автор: Suppir 12.8.2011, 15:48
Добрый день!

Нужно пробежаться по массиву arr и сделать замены в его элементах. Пишу:

Код

foreach (string line in arr)
{
     line = Regex.Replace(line, "^\d+\t(\S+)", "$1");
}



Мне в ответ:
Присвоение значений для "line" невозможно, так как он "переменная итерации foreach" (CS1656)


Как по-простому сделать перебор массива с модификацией элементов? 

Автор: YurIOs 12.8.2011, 16:01
Присваивать новое значение бежучей переменной нельзя. 

Здесь не обойтись без цыкла фор

Код

for (int i =0; i < arr.Length; i++)
{
        arr[i] =  Regex.Replace(arr[i], "^\d+\t(\S+)", "$1");
}

Автор: Suppir 12.8.2011, 16:18
Понятно, спасибо. 

я думал, покрасивей можно smile

Автор: ДобренькийПапаша 13.8.2011, 07:18
Цитата(YurIOs @  12.8.2011,  16:01 Найти цитируемый пост)
Здесь не обойтись без цыкла фор

Можно обойтись без цикла for.

Код

foreach (string line in arr.ToArray())
{
     line = Regex.Replace(line, "^\d+\t(\S+)", "$1");
}

Автор: WarHog 13.8.2011, 10:07
Нельзя. Чем этот пример отличается от примера TC? точно также идет попытка присвоения значения итерационной переменной.

Автор: KelTron 13.8.2011, 20:22
Можно и покрасивей:
Код

var arr = arr.Select(line => Regex.Replace(line, "^\d+\t(\S+)", "$1")).ToArray();

Автор: ДобренькийПапаша 14.8.2011, 09:01
Цитата(WarHog @  13.8.2011,  10:07 Найти цитируемый пост)
Нельзя. Чем этот пример отличается от примера TC? точно также идет попытка присвоения значения итерационной переменной. 

Отличается. Возьмите и проверьте.

Автор: WarHog 14.8.2011, 16:02
Код

string[] arr = { "1  2", "34", "5 6" };
foreach (string line in arr.ToArray())
{
    line = Regex.Replace(line, @"^\d+\t(\S+)", "$1");
}

На выходе
Error    1    Cannot assign to 'line' because it is a 'foreach iteration variable'

Автор: wester 14.8.2011, 19:24
ДобренькийПапаша
и чем отличается ? тем что создаем ненужный массив в foreach ? Хоть бы проверил перед тем как написать сообщение.

Автор: ДобренькийПапаша 17.8.2011, 09:38
Ойёёёё, вы меняете сам итератор. Прошу прощения. Конечно, я не прав. Но, уж извините, до такого я бы не додумался сам (менять непосредственно сам итератор в цикле).

Да уж, жесткач  :-D 

Фу, ну и бред у меня в голове.

Короче, вот мой случай:
Код

XDocument settings = XDocument.Load(XmlSettings.DefaultXmlSettingsFilePath);

            var nominals = settings.Descendants("Nominal");

            foreach (var currentNominal in nominals.ToArray())
            {
                if ((int)currentNominal.Attribute("Id") == this.GetID())
                {
                    currentNominal.Remove();
                }
            }


Без ToArray() будет ошибка)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)