检查列表<字符串>中是否已存在相同的项目

本文关键字:存在 项目 是否 列表 字符串 检查 | 更新日期: 2023-09-27 18:34:04

可能的重复项:
检查列表是否已包含项目?

for (int i = 0; i < webSites.Count(); i++)
                {
                    string t = webSites[i];
                    webCrawler(t, levels - 1);
                    // csFiles.add
                }
                MessageBox.Show(webSites.Count().ToString());
                return csFiles;

让我们说在网站我有:

www.google.com

www.microsoft.com

现在在第二关,让我们说 www.google.com 再次存在,所以这次我不想处理它来做重新反应,如果它会以同样的方式重新做一遍。我需要以某种方式制作或检查它是否会执行每个链接一次。如何检查?

我不需要检查该项目是否已经存在于列表中,我需要检查它是否已经存在,所以不要再这样做了,因为它会再次挖掘相同的链接并自行重复。

检查列表<字符串>中是否已存在相同的项目

不要为此使用列表 - 使用Hashset<string> - 这期望列表的 O(1) 查找时间而不是 O(n),并且实际上"集合"隐喻非常适合:

HashSet<string> visitedPages = new HashSet<string>();
for (int i = 0; i < webSites.Count(); i++)
{
    string page = webSites[i];
    if(visitedPages.Add(page)) //returns true if new page was added
    {
        webCrawler(page, levels - 1);
    }
}

如果你递归地调用这个方法,当然visitedPages哈希集的声明必须在方法之外,例如,使其成为成员变量,以便你可以维护访问页面的历史记录。

List.包含方法是你需要的,我猜但是

List.Contains是O(n),我会推荐一个具有O(1)查找的Hashset。

如果你的列表包含所有条目,那么你也可以使用 Linq 中的 Distinct() 函数,它将返回一个仅包含 Distinct 元素的枚举。

webSites.Distinct()

将访问过的项目保留在HashSet<string>中。

访问页面时使用Add,检查是否已经访问过该页面时Contains

创建一个临时列表并调用它,比如说,"temp"。 for 循环的每次迭代,查看 webSites 中该位置的字符串是否已经处于 temp 状态。 如果是,请忽略它。 如果不是,请将其添加到 temp,然后对其进行处理。

编辑:显然这不是最好的方法。

为什么不首先选择不同的网站列表?

foreach (var site in webSites.GroupBy(s => s))
{
  webCrawler(t, levels - 1);
  // csFiles.add
}
MessageBox.Show(webSites.Count().ToString());
return csFiles;