gpt4 book ai didi

c# - 使用 String.Contains 和巨大列表 C# 的快速方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:12 24 4
gpt4 key购买 nike

我有这样的东西:

List<string> listUser;
listUser.Add("user1");
listUser.Add("user2");
listUser.Add("userhacker");
listUser.Add("user1other");

List<string> key_blacklist;
key_blacklist.Add("hacker");
key_blacklist.Add("other");

foreach (string user in listUser)
{
foreach (string key in key_blacklist)
{
if (user.Contains(key))
{
// remove it in listUser
}
}
}

listUser的结果是:user1,user2。

问题是如果我有一个巨大的 listUser(超过 1000 万)和巨大的 key_blacklist(100.000)。该代码非常非常慢。有什么方法可以更快吗?

更新:我在那里找到了新的解决方案。 http://cc.davelozinski.com/c-sharp/fastest-way-to-check-if-a-string-occurs-within-a-string希望当他进入那里时会帮助某人! :)

最佳答案

如果您对用户列表的构建方式没有太多控制,您至少可以并行测试列表中的每个项目,这在具有多核的现代机器上会加快检查速度。

        listuser.AsParallel().Where(
s =>
{
foreach (var key in key_blacklist)
{
if (s.Contains(key))
{
return false; //Not to be included
}
}

return true; //To be included, as no match with the blacklist
});

此外 - 您是否必须使用 .Contains? .Equals 会快得多,因为在几乎所有情况下,当 HashCode 不同时,将确定不匹配,这只能通过整数比较找到。 super 快。

如果您确实需要 .Contains,您可能需要考虑重组该应用程序。列表中的这些字符串到底代表什么?单独的用户子组?我可以在添加每个字符串时测试它是否代表黑名单上的用户吗?

更新:响应@Rawling 下面的评论 - 如果您知道有一组有限的用户名,例如,“hacker”作为子字符串,那么在运行 .Equals 测试之前该组必须非常大针对候选人的每个用户名的运行将比在候选人上运行 .Contains 慢。这是因为 HashCode 非常快。

关于c# - 使用 String.Contains 和巨大列表 C# 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28148476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com