Как я могу обрезать все элементы в списке?
Я пытаюсь сделать следующее
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".
Как я могу обрезать все элементы в списке?
Ответы
Ответ 1
// 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, @"(?<=^|,) +| +(?=,|$)", "");
Ответ 2
Причина, по которой ваш подход не работает, заключается в том, что x
является копией текущей строковой ссылки, обрабатываемой в вызове ForEach
(т.е. локальным для делегата). Поэтому присваивание не влияет на элемент, указанный в списке.
Ответ 3
Что происходит, так это то, что вы пытаетесь модифицировать коллекцию с помощью оператора foreach
, который является no-no. Коллекции не могут быть изменены с помощью foreach
.
Вам нужно модифицировать цикл for
, или, используя lambdas, вы можете использовать решение LukeH.
Ответ 4
Ваша проблема в том, что между dddd и eeeee нет запятой. Если вы хотите, чтобы они были отдельными, вам нужно разделить на ' '
, разбить запятые, а затем обрезать лишние пробелы.
string tl = " aaa, bbb, ccc, dddd eeeee";
var result = t1.Split(' ').Where(s => !String.IsNullOrEmpty())
.Select(s => s.Replace(',','').Trim())
.ToArray();