【问题标题】:Merge / optimize substring statements合并/优化子字符串语句
【发布时间】:2017-12-06 03:02:05
【问题描述】:

如何优化这段代码 sn-p?

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(),但确实稍微快了一点。

现在,有没有办法进一步优化它?也许甚至让它看起来更好?

【问题讨论】:

  • 可以跳过那些SubStrings,IndexOf可以取一个起始位置,这样你就可以移动位置而不是复制大部分字符串。
  • 但是我必须使用另一个 IndexOf 来定义起始位置,因为我不知道 vttt 从哪里开始。这基本上重组了所有内容,使其成为一个不可读的单行,但我怀疑它是否会使其更高效或看起来更好
  • 你当然不必把它写成单行。只需用IndexOf 更新一个位置,然后将其用作下一个IndexOf 的起始位置,依此类推,直到达到目标
  • 您可以使用来自this answerStringBuilderIndexOf() 扩展方法,而不是进行所有这些ToString() 调用。

标签: c# optimization substring stringbuilder indexof


【解决方案1】:

正如@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() 快很多

【讨论】:

    【解决方案2】:

    按照@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() 更快,我的测试结果在这里有点生涩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      相关资源
      最近更新 更多