Я пробую следующее
string tl = " aaa, bbb, ccc, dddd eeeee";
var tags = new List<string>();
tags.AddRange(tl.Split(','));
tags.ForEach(x => x = x.Trim().TrimStart().TrimEnd());
var result = String.Join(",", tags.ToArray());
Но это не работает, теги всегда возвращаются как «aaa», «bbb».
Как я могу обрезать все элементы в список?
// you can omit the final ToArray call if you're using .NET 4
var result = string.Join(",", tl.Split(',').Select(s => s.Trim()).ToArray());
Если вам нужна только строка окончательного результата, а не промежуточная коллекция, вы можете использовать регулярное выражение для очистки строки. Вам нужно будет выполнить тест, чтобы определить, превосходит ли регулярное выражение метод разделения-обрезки-соединения:
var result = Regex.Replace(tl, @"(?<=^|,) +| +(?=,|$)", "");
Ваша проблема в том, что между dddd и eeeee нет запятой. Если вы хотите, чтобы они были раздельными, вам нужно разделить на ' '
, убрать запятые, а затем обрезать лишние пробельные символы.
string tl = " aaa, bbb, ccc, dddd eeeee";
var result = t1.Split(' ').Where(s => !String.IsNullOrEmpty())
.Select(s => s.Replace(',','').Trim())
.ToArray();
Причина, по которой ваш подход не работает, заключается в том, что x
является копией текущей строковой ссылки, обрабатываемой в ForEach Вызов
(т.е. локальный для делегата). Следовательно, присвоение не влияет на элемент, указанный в списке.
Что происходит, так это то, что вы пытаетесь изменить коллекцию с помощью оператора foreach
, что является недопустимым. Коллекции не могут быть изменены с помощью foreach
.
Вам нужно будет изменить его как цикл for
или, используя лямбды, вы можете использовать решение LukeH.