c# - 我怎样才能快速计算字符串出现在字符串列表的给定部分中的频率?

标签 c# list optimization

我有一个字符串列表,我需要计算其中出现特定字符串的列表条目的数量(整个列表只针对列表的一个子集,而不是整个列表)。

下面的代码工作得很好,但它的性能......遗憾的是,我需要解析 500k 到 900k 的列表条目,所以不能接受。对于这些条目,我需要运行下面的代码大约 10k 次(因为我有 10k 个列表部分需要分析)。为此,它需要 177 秒甚至更多。所以我的问题是我怎样才能做到这一点...快?

private int ExtraktNumbers(List<string> myList, int start, int end)
{
    return myList.Where((x, index) => index >= start && index <= end 
                        && x.Contains("MYNUMBER:")).Count();
}

最佳答案

现在我们知道您调用该方法 10,00 次了,这是我的建议。我假设您已经硬编码了“Number:”,这意味着您在每次调用时都在做不同的范围?那么如果是这样的话......

首先,运行“索引”方法并创建一个匹配索引的列表。然后,您可以轻松计算所需范围内的匹配项。

注意:这很快,您甚至可以进一步优化它:

List<int> matchIndex = new List<int>();

void RunIndex(List<string> myList)
{
    for(int i = 0; i < myList.Count; i++)
    {
        if(myList[i].Contains("MYNUMBER:"))
        {
            matchIndex.Add(i);
        }
    }
}

int CountForRange(int start, int end)
{
    return matchIndex.Count(x => x >= start && x <= end);
}

然后你可以这样使用,例如:

RunIndex(myList);

// I don't know what code you have here, this is just basic example.
for(int i = 0; i <= 10,000; i++)
{
    int count = CountForRange(startOfRange, endOfRange);
    // Do something with count.
}

此外,如果您检查的范围内有很多重复项,那么您可以考虑在字典中缓存范围计数,但在这个阶段,很难判断这样做是否值得。

关于c# - 我怎样才能快速计算字符串出现在字符串列表的给定部分中的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779392/

相关文章:

c# - .NET 中的身份验证、授权、用户和角色管理以及一般安全性

c# - 如何获取存储在内存中的可执行文件的 FileVersion 信息作为字节数组?

c# - Mvvm中的ICommand是什么原因?

list - orgmode,引用编号列表中的项目

caching - Google Webfonts 的缓存验证器

c# - Visual Studio 2017 RC 中缺少 Reportviewer 工具

python - 如何将数据框行分组到 Pandas groupby 中的列表中

Python 将列值分组为一个值

c - 具有不同优化级别的 GNU 并行运行 Makefile

ruby-on-rails - Rails 的最佳图像优化技术