Заменить строковые значения в списке
У меня есть коллекция строк, которые содержат значения, такие как"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