IEnumerable<string> values = new List<string>();
values = …
可能不會是一個大問題,但爲什麼創建一個新的List<string>()
只是把它扔掉。替換爲這兩種:
IEnumerable<string> values;
values = …
如果您需要在前面的範圍定義values
,或者只是:
Enumerable<string> values = …
再後來就:
….Select(v => Regex.Replace(v.Value, "\\s+", " ")).ToList();
你真的需要它成爲一個列表?只比較速度:
….Select(v => Regex.Replace(v.Value, "\\s+", " "));
還有時會比較慢,而且有些時候,它只是將無法正常工作,但也有很多次,其中ToList()
只是一個時間和內存浪費時間。
string joined = string.Concat(
element.ToString().Split().Take(3))
+ string.Join(" ", element.ToString().Split().Skip(3));
的第一件事就是爲什麼你叫ToString()
和Split()
兩次?:
var splitOnWhiteSpace = element.ToString().Split();
string joined = string.Concat(
splitOnWhiteSpace.Take(3))
+ string.Join(" ", splitOnWhiteSpace.Skip(3));
我們也許可以用自定義的方式優化Join
太:
var elString = element.ToString();
var buffer = new StringBuilder(element.Length - 2); //Can't be larger, unlikely to be much smaller so obtain necessary space in advance.
using(var en = elString.Split().GetEnumerator())
{
int count = 0;
while(en.MoveNext() && ++count != 4)
buffer.Append(en.Current);
while(en.MoveNext())
buffer.Append(en.Current).Append(' ');
}
string joined = buffer.ToString();
如果這是被幾個循環擊中,我會考慮在循環之間保持緩衝區(Clear()
它在每次使用之後而不是創建一個新的)。
如果被拆分的字符串非常大,我可能會考慮一個自定義版本Split()
,它會遍歷字符串,只發出它需要的塊,而不是在每個過程中創建一個數組,但我不會擔心,直到我我首先嚐試了上述更明顯的改進。
謝謝你,你的建議改善了一點性能! – sparta93
GB數據的處理時間從大約7分鐘變爲大約6.4分鐘 – sparta93
如果您將'XElement'方法替換爲使用'XmlReader'的方法,並以流方式執行此操作('yield return'ing results as it得到他們)你可能會做得更好; 'XmlReader'使用起來很快,但通常速度更快。 –