2010-04-26 80 views
7

不知怎的,我似乎无法在C#中的foreach循环中的字符串替换工作。我的代码如下:在foreach循环中的c#string.replace

foreach (string s in names) 
{ 
    s.Replace("pdf", "txt"); 
} 

我仍然很新的LINQ所以原谅我,如果这听起来业余;)

回答

30

你说你一个LINQ的解决方案后,是......这很简单:

var replacedNames = names.Select(x => x.Replace("pdf", "txt")); 

我们不知道的names类型,但如果你要分配回吧你可能使用ToArrayToList

// 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在所有此刻虽然代码...

21

字符串在C#中是不变的(不改变),所以s.Replace会返回一个新的字符串。不幸的是,这意味着你不能使用foreach来进行更新。如果名字是一个数组这应该工作:

for(int i = 0; i < names.Length; i++) 
{ 
    names[i] = names[i].Replace("pdf", "txt"); 
} 
+2

但是对于'名单'工作过。只需将_Length_替换为_Count_ – 2010-04-26 08:42:54

0

s.Replace是一个函数,所以你想S = s.Replace()。虽然它是更好地使用StringBuilder。 (见上面的答案)

+4

为什么在这里使用StringBuilder会更好?这不像多个替换正在* same *字符串上执行。 – 2010-04-26 08:32:43

3

正如其他人所提到的,您需要使用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"); 
+1

在这里使用查询表达似乎过分 - 如果你只是做一个Select,为什么不直接调用它?尽管为Path.ChangeExtension +1。 – 2010-04-26 08:46:07

+0

@Jon - 我只是认为查询表达式看起来更好,并且更容易阅读。它全部编译成相同的代码,并输入一些额外的字符并不会真的打扰我。如果我正在做一些无法在查询中表达的内容,例如使用跳转/获取或转换为列表,那么我可能会直接使用扩展方法。 – 2010-04-26 08:54:30

+0

我想这只是个人偏好......我当然喜欢查询表达式,当他们变得更复杂时,但如果你只是做一个单一的过滤器或单个投影,他们似乎不那么直接的表达方式。 – 2010-04-26 09:00:55