这个小代码的ForEach替换不能达到我的预期.我在这做错了什么?

Jan*_*ray 4 c# replace linqpad

我不知道这是否与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
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 13

正如其他人所指出的,字符串是不可变的.调用Replace只会返回一个新字符串; 它不会改变现有的字符串.以下是三种方法:

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

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

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

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

或者,创建一个数组并在适当的位置改变数组:

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN";  
string[] lastNames = s.Split(',');
for (int i = 0; i < lastNames.Length; ++i)
    lastNames[i] = lastNames[i].Trim();
Run Code Online (Sandbox Code Playgroud)

  • @Dhananjay:字符串是不可变的.数组是变量的集合,根据定义是可变的; 这就是为什么他们被称为变量. (3认同)

Pin*_*nyM 10

Replace返回一个新值,但不会影响您调用它的原始String.要做你需要的事情,你必须建立一个新的集合,结果来自Replace- 你可以通过以下方式轻松完成Select:

var replaced = list.Select(i=>i.Replace(" ",String.Empty));
Run Code Online (Sandbox Code Playgroud)

另一个好处是,你不需要施展List<T>到这样做.

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

var collection = lastNames.Split(',').Select(i => i.Trim());
Run Code Online (Sandbox Code Playgroud)