如何優化此代碼段?合併/優化子串語句
string page = wc.DownloadString("https://www.youtube.com/browse_ajax?action_continuation=1&continuation=4qmFsgI8EhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaIEVnWjJhV1JsYjNNZ0FEQUJPQUZnQVdvQWVnRTB1QUVB");
int pos;
while ((pos = page.IndexOf("/watch?v=")) > 0) {
page = page.Substring(pos);
page = page.Substring(page.IndexOf("video-time"));
page = page.Substring(page.IndexOf("aria-label"));
page = page.Substring(page.IndexOf(@"\u003e") + 6);
string vt = page.Substring(0, page.IndexOf(@"\u003c"));
page = page.Substring(page.IndexOf("title=") + 1);
page = page.Substring(page.IndexOf("title=") + 1);
page = page.Substring(page.IndexOf("title=") + 1);
page = page.Substring(page.IndexOf("\\\"") + 2);
string tt = page.Substring(0, page.IndexOf("\\\" aria-describedby="));
}
可悲的是,我不能只跳過一些Substring
線,因爲這似乎是找到vt
和tt
正確次數的唯一途徑。 由於Substring
總是返回一個新字符串我試着用StringBuilder
的解決方案:
System.Text.StringBuilder sb=new System.Text.StringBuilder(wc.DownloadString("https://www.youtube.com/browse_ajax?action_continuation=1&continuation=4qmFsgI8EhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaIEVnWjJhV1JsYjNNZ0FEQUJPQUZnQVdvQWVnRTB1QUVB"));
int pos;
while ((pos = sb.ToString().IndexOf("/watch?v=")) > 0) {
sb.Remove(0,pos);
sb.Remove(0,sb.ToString().IndexOf("video-time"));
sb.Remove(0,sb.ToString().IndexOf("aria-label"));
sb.Remove(0,sb.ToString().IndexOf(@"\u003e") + 6);
string vt =sb.ToString(0,sb.ToString().IndexOf(@"\u003c"));
sb.Remove(0,sb.ToString().IndexOf("title=") + 1);
sb.Remove(0,sb.ToString().IndexOf("title=") + 1);
sb.Remove(0,sb.ToString().IndexOf("title=") + 1);
sb.Remove(0,sb.ToString().IndexOf("\\\"") + 2);
string tt =sb.ToString(0,sb.ToString().IndexOf("\\\" aria-describedby="));
}
我很驚訝地發現,這個解決方案,雖然它看起來並不像因所有ToString()
,確實是稍快。
現在,有沒有辦法對此進一步優化?也許甚至讓它看起來更好?
你*可以跳過那些SubString,IndexOf可以取得一個起始位置,所以你可以移動位置而不是複製大部分字符串。 – harold
然而,我不得不通過使用另一個IndexOf來定義起始位置,因爲我不知道'vt'和'tt'開始的位置。這基本上重組了一切,使它成爲一個難以理解的單線程,但我懷疑它使它更有效率或更好看 – Kartoffel
當然你不必把它寫成單線程。只需用'IndexOf'更新一個位置,然後用它作爲下一個'IndexOf'的開始位置,依此類推,直到達到目標 – harold