@Mental_Force

Как реализовать изменение элементов входной последовательности методом расширения ForAll(Action) PLINQ?

Не могу сообразить, как модифицировать элементы входной последовательности методом расширения ForAll(lamda).

Допустим есть массив:
string[] lines = { "max9", "cat", " joe", "line", "jgeg9nj", "ergeg",
                               "egerg", "egreg4g", "29fweggf", "wfw99efyopkb" };


Я хочу добавить в конец каждой строке, которая содержит "9" некую метку:

lines.AsParallel().Where(l=> l.Contains("9")==true)
                .ForAll(l => l+="MARK");

// Убеждаемся что последовательность осталась без изменений, а жаль
foreach (var line in lines)
                Console.WriteLine(line);

            Console.ReadLine();


Я так подозреваю что я модифицирую всего лишь копию элемента, а не сам элемент. Как получить ссылку на экземпляр строки внутри лямбды?

Подчеркиваю, что мне нужно сделать это средствами PLINQ, а точнее методом ForAll который выполняется на каждом из элементов последовательности. Не предлагайте очевидные всем способы как это сделать в цикле используя обычный linq.
  • Вопрос задан
  • 2711 просмотров
Решения вопроса 1
aush
@aush
lines = lines.AsParallel().Select(l => l.Contains("9") ? l + "MARK" : l).ToArray();


Select обработает элементы параллельно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mental_Force Автор вопроса
Спасибо за внимание, но я не понял чем это мне поможет. Кстати я определил что если использовать в качестве элементов коллекции любые другие объекты, то проблем не возникает. Например такой код работает корректно:
class cl
 {
 public string name;
 public string city;

 public cl(string n, string c)
 {
 name = n;
 city = c;
 }
 }

 List<storage> = new List();
 storage.Add(new cl("wfwf","wefwe" ));
 storage.Add(new cl("wfwf", "wefwe"));
 storage.Add(new cl("wfwf", "wefwe"));

 storage.AsParallel().Select(i => i).ForAll(i =>i.name="qq");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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