Почему моя попытка обрезать строки в List<string> не работает?
Я попробовал следующий код в LINQPad и получил результаты, приведенные ниже:
List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s)
{
s.Trim();
});
listFromSplit.Dump();
"а" и "б"
так что буква b не убрала пробел, как я ожидал...?
У кого есть идеи
[ПРИМЕЧАНИЕ: метод.Dump() - это метод расширения в LINQPad, который печатает содержимое любого объекта в хорошем интеллектуальном формате]
8 ответов
Метод String.Trim() возвращает строку, представляющую обновленную строку. Он не обновляет сам строковый объект, а создает новый.
Вы могли бы сделать это:
s = s.Trim();
Однако вы не можете обновить коллекцию при перечислении через нее, поэтому вам нужно либо заполнить новый список при перечислении поверх существующего, либо заполнить список вручную, используя строковый массив, возвращаемый String.Split.
Заполнение нового списка:
List<string> temp = new List<string>("a, b".Split(",".ToCharArray()));
List<string> listFromSplit = new List<string>();
temp.ForEach(delegate(string s)
{
listFromSplit.Add(s.Trim());
});
listFromSplit.Dump();
Заполнение вручную:
string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();
foreach (string s in temp)
{
listFromSplit.Add(s.Trim());
};
listFromSplit.Dump();
Вы просто создаете обрезанную строку, а не назначаете ей ничего.
var s = " asd ";
s.Trim();
не будет обновлять s, пока..
var s = " asd ";
s = s.Trim();
будут..
var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());
было бы, я полагаю, быть, как я бы пошел об этом.
В дополнение к ответу Адриана Куна вы можете сделать следующее:
var result = listFromSplit.Select(s => s.Trim());
Экземпляры строки являются неизменяемыми. Все, что кажется изменяющим один, создает новый экземпляр.
Вы не назначаете усеченный результат чему-либо. Это классическая ошибка, у меня только что появилась привычка делать эту ошибку со строкой. Заменить:)
У меня нет IDE и работает, но это должно сделать работу (если я не ошибаюсь):
var result = from each in listFromSplit select each.Trim();
Разделите пробелы и запятые и удалите все пустые записи. Все красиво и аккуратно. Предполагается, что ваши строки не содержат пробелов, хотя.
List<string> listFromSplit =
new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Опции linq, предоставленные другими, должны хорошо работать. В качестве другого варианта, вот метод расширения, использующий цикл for:
public static void TrimCollection(this IList<string> stringCollection) {
for (int i = 0; i <= stringCollection.Count() - 1; i++)
stringCollection[i] = stringCollection[i].Trim();
}