4

我不知道这是否与 LINQPad 相关,或者我做错了什么,但是这段代码没有做我想做的事情,特别是ForEach(...)

我的目标是用空字符串替换“”;有一个更好的方法吗?

var lastNames = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";

var listLastNames = lastNames.Split(',');
var list = listLastNames.ToList(); //so I can use .ForEach
list.ForEach(i=>i.Replace(" ",String.Empty));

list.Dump(); //show it on output
4

2 回答 2

13

正如其他人指出的那样,字符串是不可变的。调用 Replace 只返回一个新字符串;它不会改变现有的字符串。这里有三种方法可以做你想做的事:

序列进行转换,并在最后将其转换为列表:

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";  
List<string> lastNames = s.Split(',').Select(x=>x.Trim()).ToList();

或者,查询语法中的相同内容:

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 
var query = from lastName in s.Split(',')
            select lastName.Trim();
List<string> lastNames = query.ToList();

或者,创建一个数组并就地改变数组:

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";  
string[] lastNames = s.Split(',');
for (int i = 0; i < lastNames.Length; ++i)
    lastNames[i] = lastNames[i].Trim();
于 2012-04-24T21:44:54.453 回答
10

Replace返回一个新值,但不会影响您调用它的原始字符串。要执行您需要的操作,您必须使用以下结果构建一个新集合Replace- 您可以通过以下方式轻松完成此操作Select

var replaced = list.Select(i=>i.Replace(" ",String.Empty));

另一个好处是,您不需要强制转换为 aList<T>来执行此操作。

正如其他人指出的那样,您可以使用Trim()比以下更清洁的解决方案Replace()

var collection = lastNames.Split(',').Select(i => i.Trim());
于 2012-04-24T21:35:46.250 回答