Почему моя попытка обрезать строки в списке<string> , похоже, не работает?

StackOverflow https://stackoverflow.com/questions/205299

Вопрос

Я попробовал следующий код в LINQPad и получил результаты, приведенные ниже:

List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s) 
{ 
  s.Trim(); 
});
listFromSplit.Dump();

"а" и "б"

значит, в букве b не убрали пробел, как я ожидал ...?

У кого-нибудь есть какие-нибудь идеи

[ПРИМЕЧАНИЕ:метод .Dump() - это метод расширения в LINQPad, который выводит содержимое любого объекта в удобном интеллектуальном формате]

Это было полезно?

Решение

Метод String.Trim() возвращает строку, представляющую обновленную строку.Он не обновляет сам объект string, а скорее создает новый.

Ты мог бы это сделать:

s = s.Trim();

Однако вы не можете обновлять коллекцию при перечислении через нее, поэтому вам нужно либо заполнить новый список при перечислении поверх существующего, либо заполнить список вручную, используя массив строк, возвращаемый String .Разделить.

Заполнение нового списка:

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());

Экземпляры string являются неизменяемыми.Все, что, по-видимому, изменяет один из них, создает вместо него новый экземпляр.

Вы ничему не присваиваете обрезанный результат.Это классическая ошибка, я только что отвык от этой ошибки со строкой.Заменить :)

У меня нет запущенной 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();

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top