不知怎的,我似乎無法在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