为什么我尝试修剪List <string>中的字符串似乎不起作用?</string>

时间:2008-10-15 16:00:39

标签: foreach anonymous-methods generic-list

我在LINQPad中尝试了以下代码并获得了以下结果:

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

“a”和“b”

所以字母b没有像我期待的那样去掉白色空间......?

任何人都有任何想法

[注意:.Dump()方法是LINQPad中的一个扩展方法,它以一种漂亮的智能格式打印出任何对象的内容]

8 个答案:

答案 0 :(得分:17)

你只是创建一个修剪过的字符串,而不是为它指定任何东西。

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

不会更新s,而..

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

将......

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());
我猜想,我会怎么做。

答案 1 :(得分:10)

String.Trim()方法返回表示更新后的字符串的字符串。它不会更新字符串对象本身,而是创建一个新对象。

你可以这样做:

s = s.Trim();

但是,在枚举时无法更新集合,因此您希望在枚举现有集合时填充新List,或者使用String.Split返回的字符串数组手动填充List。

填写新名单:

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

答案 2 :(得分:4)

Adrian Kuhn发布的答案外,您还可以执行以下操作:

var result = listFromSplit.Select(s => s.Trim());

答案 3 :(得分:2)

字符串实例是不可变的。任何似乎修改一个的东西,都会创建一个新实例。

答案 4 :(得分:1)

您没有将修剪结果分配给任何内容。这是一个经典的错误,我只是出于习惯用string.Replace制造这个错误:)

答案 5 :(得分:1)

我没有IDEA启动并运行,但这应该完成工作(除非我错了):

var result = from each in listFromSplit select each.Trim();

答案 6 :(得分:0)

在空格和逗号上拆分并删除所有空条目。一切都很好,修剪整齐。但是假设你的字符串不包含空格。

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

答案 7 :(得分:0)

其他人提供的linq选项应该运作良好。作为另一种选择,这里是使用for循环的扩展方法:

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

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

    }