我有这样的事情:

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/

10-14 22:08