Почему моя попытка обрезать строки в списке <string>не работает? - PullRequest
5 голосов
/ 15 октября 2008

Я попробовал следующий код в 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 ]

17 голосов
/ 15 октября 2008

вы просто создаете обрезанную строку, не назначая ей ничего.

var s = "  asd   ";
s.Trim();

не будет обновлять s, пока ..

var s = "   asd   ";
s = s.Trim();

будет ..

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());

было бы, я полагаю, быть таким, как я поступил бы.

10 голосов
/ 15 октября 2008

Метод 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();
4 голосов
/ 25 февраля 2009

В дополнение к ответу, опубликованному Адриан Кун , вы можете сделать следующее:

var result = listFromSplit.Select(s => s.Trim());
2 голосов
/ 15 октября 2008

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

1 голос
/ 15 октября 2008

У меня нет запущенной IDE, но это должно сделать работу (если я не ошибаюсь):

var result = from each in listFromSplit select each.Trim();
1 голос
/ 15 октября 2008

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

0 голосов
/ 10 августа 2012

Параметры linq, предоставленные другими, должны хорошо работать. В качестве другого варианта, вот метод расширения, использующий цикл for:

    public static void TrimCollection(this IList<string> stringCollection) {

        for (int i = 0; i <= stringCollection.Count() - 1; i++)
            stringCollection[i] = stringCollection[i].Trim();

    }
0 голосов
/ 15 октября 2008

Разделите пробелы и запятые и удалите все пустые записи. Все красиво и аккуратно. Предполагается, что ваши строки не содержат пробелов.

List<string> listFromSplit =
     new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));
...