2010-04-26 86 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