【问题标题】:String array: search for text, return line number of first occurrence字符串数组:搜索文本,返回第一次出现的行号
【发布时间】:2014-03-21 17:12:43
【问题描述】:

在我的字符串数组中,我想查找一些文本并将第一次出现的行号作为 int 返回。

这是有效的;

public static int LookUpLineNumber(String[] item, string TextToLookUp)
{
    int m;
    for (m = 0; m < item.Count(); m++)
    {
        if (item[m].Contains(TextToLookUp))
        {
            break;
        }
    }
    return m++;
}

但是,我想知道是否有任何方法可以优化它的效率和长度?

速度对比: (使用大小为 10.000 的字符串数组运行 10.000 次的平均时间)

  1. 使用我的代码:

    • 1,259 毫秒
  2. 使用 Habib 的代码:Array.FindIndex&lt;string&gt;(item, r =&gt; r.Contains(TextToLookUp));

    • 0,906ms

【问题讨论】:

  • String[] item 中有多少项目?过早的优化是不好的优化。我也看不出这种方法会慢的任何原因。
  • 如何在string[]中找到行号?
  • 你可以使用 Array.BinarySearch
  • 每个字符串都是一行吗?
  • 您需要在任何范围内匹配还是完全匹配?

标签: c# arrays line-numbers


【解决方案1】:

您当前的解决方案看起来不错。您可以使用return m; 而不是return m++

如果您想缩短代码,可以使用Array.FindIndex&lt;T&gt;,例如:

public static int LookUpLineNumber(String[] item, string TextToLookUp)
{
    return Array.FindIndex<string>(item, r => r.Contains(TextToLookUp));
}

不确定它是否会给您带来任何性能提升。

【讨论】:

  • 什么都可以,可能会稍微慢一些。不过需要测试一下
  • @Simon,如果没有适当的测试,真的不能说。但是,无论性能差异如何,都可以忽略不计。这就是为什么我说它只是一个简短的代码。
  • 这就是我的建议
  • 它在内部执行完全相同的 for 循环,但有额外的参数检查:referencesource.microsoft.com/#mscorlib/system/array.cs#1132
  • @Simon 所以我用我的方法和 Habib 的方法进行了性能测试。使用大小为 10.000 的字符串数组运行 10.000 的平均时间:使用我的代码:1,259 毫秒;使用 Habib 的代码:0,906ms。
【解决方案2】:

如果您需要多次执行此操作,由数组构建的后缀树将是最快的方法:

http://en.wikipedia.org/wiki/Suffix_tree

但是,如果您不重新使用数组,那么我认为您使用的方法可能是最快的,没有使用正则表达式来执行包含,如果使用正则表达式 可能会更快是预编译的。

【讨论】:

    【解决方案3】:

    您还可以执行以下操作:-

    Array.FindIndex(item,i=>i.Contains(TextToLookUp));
    

    即使没有排序,上述方法也可以工作。

    上面可以通过使用IndexOf操作而不是Contains并传递StringComparison.OrdinalIgnoreCase来进一步优化。然后你必须将它与 0 进行比较。

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多