这个小代码上的 ForEach 替换没有做我期望它做的事情。我在这里做错了什么?



我不知道这是否与 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

正如其他人指出的那样,字符串是不可变的。调用替换只是返回一个新字符串;它不会就地改变现有字符串。以下是执行所需操作的三种方法:

序列进行转换,并将其转换为末尾的列表:

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

Replace返回一个新值,但不会影响调用它的原始字符串。 要做你需要做的事情,你必须使用Replace的结果建立一个新的集合 - 你可以用Select轻松做到这一点:

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

另一个好处是,您无需投射到List<T>即可执行此操作。

正如其他人指出的那样,您可以将Trim()用作比Replace()更干净的解决方案:

var collection = lastNames.Split(',').Select(i => i.Trim());

相关内容

  • 没有找到相关文章

最新更新