我不知道这是否与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
答案 0 :(得分: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();
答案 1 :(得分:10)
Replace
返回一个新值,但不会影响您调用它的原始String。为了满足您的需求,您必须使用Replace
的结果构建新的集合 - 您可以使用Select
轻松完成此操作:
var replaced = list.Select(i=>i.Replace(" ",String.Empty));
另一个好处是,您无需强制转换为List<T>
来执行此操作。
正如其他人所指出的那样,您可以使用Trim()
作为比Replace()
更清晰的解决方案:
var collection = lastNames.Split(',').Select(i => i.Trim());