2017-07-02 31 views
0

如何優化此代碼段?合併/優化子串語句

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線,因爲這似乎是找到vttt正確次數的唯一途徑。 由於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(),確實是稍快。

現在,有沒有辦法對此進一步優化?也許甚至讓它看起來更好?

+2

你*可以跳過那些SubString,IndexOf可以取得一個起始位置,所以你可以移動位置而不是複製大部分字符串。 – harold

+0

然而,我不得不通過使用另一個IndexOf來定義起始位置,因爲我不知道'vt'和'tt'開始的位置。這基本上重組了一切,使它成爲一個難以理解的單線程,但我懷疑它使它更有效率或更好看 – Kartoffel

+0

當然你不必把它寫成單線程。只需用'IndexOf'更新一個位置,然後用它作爲下一個'IndexOf'的開始位置,依此類推,直到達到目標 – harold

回答

0

相當快了很多正如@dbc建議,使用these extension methods

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.IndexOf("video-time")); 
    sb.Remove(0,sb.IndexOf("aria-label")); 
    sb.Remove(0,sb.IndexOf(@"\u003e") + 6); 
    string vt =sb.ToString(0,sb.IndexOf(@"\u003c")); 
    sb.Remove(0,sb.IndexOf("title=") + 1); 
    sb.Remove(0,sb.IndexOf("title=") + 1); 
    sb.Remove(0,sb.IndexOf("title=") + 1); 
    sb.Remove(0,sb.IndexOf("\\\"") + 2); 
    string tt =sb.ToString(0,sb.IndexOf("\\\" aria-describedby=")); 
} 

應該會更快比使用StringBuilderToString(),我的測試結果在這裏有點生澀。

0

正如@harold建議

string page = wc.DownloadString("https://www.youtube.com/browse_ajax?action_continuation=1&continuation=4qmFsgI8EhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaIEVnWjJhV1JsYjNNZ0FEQUJPQUZnQVdvQWVnRTB1QUVB"); 
int pos; 
while ((pos = page.IndexOf("/watch?v=")) > 0) { 
    int subPos=pos; 
    subPos=page.IndexOf("video-time",subPos); 
    subPos=page.IndexOf("aria-label",subPos); 
    subPos=page.IndexOf(@"\u003e",subPos); 
    subPos+=6; 
    string vt=page.Substring(subPos,(subPos=page.IndexOf(@"\u003c",subPos))); 
    subPos=page.IndexOf("title=",subPos); 
    subPos++; 
    subPos=page.IndexOf("title=",subPos); 
    subPos++; 
    subPos=page.IndexOf("title=",subPos); 
    subPos=page.IndexOf("\\\"",subPos); 
    subPos+=2; 
    string tt=page.Substring(subPos,(subPos=page.IndexOf("\\\" aria-describedby=", subPos))); 
    page=page.Substring(subPos); 
} 

似乎比使用StringBuilderToString()