Заменить строковые значения в списке

У меня есть коллекция строк, которые содержат значения, такие как"goalXXvalue,goalXXLength,TestXX". Это список (строки) Я думал, что смогу перебрать каждый элемент и заменить значение XX, которое я пробовал с помощью метода ниже, но значения не меняются. Где я ошибаюсь? Спасибо

metricList.ForEach(Function(n) n.Replace("XX", "1"))

3 ответов


у вас есть несколько вопросов:

  • во-первых, строки неизменяемы, поэтому при вызове .Replace вы возвращаете новую строку. Зову n.Replace не изменять n.
  • назначение n в вашей анонимной функции не повлияет на значение, которое находится в вашем списке.
  • независимо от вышеизложенного, вы не можете изменить содержимое своей коллекции при ее перечислении, потому что это сделает перечисление недействительным.

поскольку кажется ты изменяя каждую строку в вашем списке, кажется ненужным пытаться изменить коллекцию на месте. Поэтому решением succint будет использование Linq для создания нового списка:

var newList = metricList.Select(s => s.Replace("XX", "1")).ToList();

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

C#

for(int i = 0; i < metricList.Count; i++)
{
    metricList[i] = metricList[i].Replace("XX", "1");
}

VB.NET

For i As Integer = 0 To metricList.Count - 1
    metricList(i) = metricList(i).Replace("XX", "1")
Next

код перебирает все строки в metricList и заменяет XX на 1, затем он сохраняет значения в правильном месте в списке, что вы не делаете в своем коде...

или с помощью В LINQ:

C#

var newList = metricList.Select(x => x.Replace("XX", "1")).ToList();

VB.NET

Dim newList = metricList.Select(Function(x) x.Replace("XX", "1")).ToList()

не забудьте добавить ссылку на linq в верхней части вашего класса:

C#

using System.Linq;

VB.NET

Imports System.Linq

вам нужно назначить результат строки.Заменить метод. Таким образом, ваш func должен вернуть что-то или использовать вместо foreach select