不知怎的,我似乎无法在C#中的foreach循环中的字符串替换工作。我的代码如下:在foreach循环中的c#string.replace
foreach (string s in names)
{
s.Replace("pdf", "txt");
}
我仍然很新的LINQ所以原谅我,如果这听起来业余;)
不知怎的,我似乎无法在C#中的foreach循环中的字符串替换工作。我的代码如下:在foreach循环中的c#string.replace
foreach (string s in names)
{
s.Replace("pdf", "txt");
}
我仍然很新的LINQ所以原谅我,如果这听起来业余;)
你说你一个LINQ的解决方案后,是......这很简单:
var replacedNames = names.Select(x => x.Replace("pdf", "txt"));
我们不知道的names
类型,但如果你要分配回吧你可能使用ToArray
或ToList
:
// If names is a List<T>
names = names.Select(x => x.Replace("pdf", "txt")).ToList();
// If names is an array
names = names.Select(x => x.Replace("pdf", "txt")).ToArray();
你应该知道,你已经张贴不使用LINQ在所有此刻虽然代码...
字符串在C#中是不变的(不改变),所以s.Replace
会返回一个新的字符串。不幸的是,这意味着你不能使用foreach
来进行更新。如果名字是一个数组这应该工作:
for(int i = 0; i < names.Length; i++)
{
names[i] = names[i].Replace("pdf", "txt");
}
s.Replace是一个函数,所以你想S = s.Replace()。虽然它是更好地使用StringBuilder。 (见上面的答案)
为什么在这里使用StringBuilder会更好?这不像多个替换正在* same *字符串上执行。 – 2010-04-26 08:32:43
正如其他人所提到的,您需要使用for
循环来完成此操作。但是,如果您不需要在原地进行操作(即结果可以是不同的集合),那么您也可以将它作为linq查询来完成,例如,
var results = from name in names select name.Replace("pdf", "txt");
但有一件事 - 它看起来像你试图改变一些文件名的扩展名。如果这就是你想要做的,那么我建议Path.ChangeExtension
这是专门为此目的而设计的。
var results = from name in names select Path.ChangeExtension(name, "txt");
在这里使用查询表达似乎过分 - 如果你只是做一个Select,为什么不直接调用它?尽管为Path.ChangeExtension +1。 – 2010-04-26 08:46:07
@Jon - 我只是认为查询表达式看起来更好,并且更容易阅读。它全部编译成相同的代码,并输入一些额外的字符并不会真的打扰我。如果我正在做一些无法在查询中表达的内容,例如使用跳转/获取或转换为列表,那么我可能会直接使用扩展方法。 – 2010-04-26 08:54:30
我想这只是个人偏好......我当然喜欢查询表达式,当他们变得更复杂时,但如果你只是做一个单一的过滤器或单个投影,他们似乎不那么直接的表达方式。 – 2010-04-26 09:00:55
为什么使用替换,这会使应用程序变慢。使用正则表达式:
http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace.aspx
根据这家伙测试:http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/04/02/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has-好performance.aspx – grmbl 2013-06-28 09:05:29
但是对于'名单'工作过。只需将_Length_替换为_Count_ –
2010-04-26 08:42:54