Distinct()值仍然允许重复

时间:2020-05-28 07:15:51

标签: c#

这是另一个编程问题,我认为一切看起来都不错,但不能按预期工作。

我想做的是使用htmlagilitypack从网页上抓取所有链接,并将其添加到数据网格中,但不要将重复项添加到数据网格中。

代码:

webBrowser.Navigate(url);

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(webBrowser.DocumentText);

if (debug)
{
    Helpers.SaveDebugToFile(@"Debug\[google.com]-" + DateTime.Now.ToString("hhmmssffffff") + "-debug.html", webBrowser.DocumentText);
}

List<string> values = new List<string>();

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
    HtmlAttribute href = link.Attributes["href"];

    if (href.Value.Contains("google.") || href.Value.Contains("search?") || href.Value.StartsWith("/") || href.Value.Length < 5)
    {
        // Ignore.
    }
    else
    {
        // DO NOT ADD TO THE DATAGRID IF href.Value ALREADY EXISTS IN COLUMN 1 //
        values.Add(href.Value);
    }
}

foreach (var value in values.Distinct().ToList())
{
    DataGridViewLinks.Rows.Add(value, randomKeyword);
}

该代码有效,但是它仍在第一列中添加重复项,但是我只在其中添加了Distinct()值(或者这就是我想要的)。

我看不到这个问题的原因,我已经看了好几次代码了,没有发现明显的错误。

编辑:

enter image description here

2 个答案:

答案 0 :(得分:0)

正如上面的评论中已经提到的,很可能是内容不完全相同的地方(不同的大小写,某些前导或尾随空格,...)

更好的方法是在插入“值”列表时已经检查重复项(使用定义的大小写并删除空格)

答案 1 :(得分:0)

代替直接在for循环中使用Distinct,您可以在List中检查结果,获取所有值,然后查找问题是否出在代码的这一部分或其他任何部分。循环迭代时,可能会添加列表。