我有这样的事情:
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# - 使用带有巨大列表 C# 的 String.Contains 的快速方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28148476/