使用Distinct删除列表中的重复项

时间:2014-12-19 23:37:33

标签: c#

我试图从我正在处理的浏览器列表中删除重复的ID。该列表将转换为数组,然后添加到richtextbox。这是我正在使用的通用书签系统所必需的。问题是它刮擦重复。即使我在代码中添加了不同的内容。

string html = WebsCon2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML");
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html); var playerIds = new List<string>();
var playerNodes = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]").Distinct();
foreach (var playerNode in playerNodes)
{
    string href = playerNode.Attributes["href"].Value;
    var parts = href.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length > 1)
    {
        playerIds.Add(parts[1]);
    }
    string Target = string.Join("", playerIds.ToArray());
    PlayerID.Text = Target;
}

那么我可以通过另一种方式删除重复项吗?

2 个答案:

答案 0 :(得分:3)

问题是Distinct没有按照内容比较您的节点。它通过引用比较它们。如果您想要InnerText之间的不同节点,可以使用:

var playerNodes = htmlDoc.DocumentNode
            .SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]")
            .GroupBy(node => node.InnerText)
            .Select(g => g.First());

或者您可以使用MoreLINQ中的DistinctBy方法:

var playerNodes = htmlDoc.DocumentNode
            .SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]")
            .DistinctBy(node => node.InnerText);

答案 1 :(得分:2)

playerIds声明为HashSet<string>,然后您确定不会有重复项。这是解决问题的简单方法。检查HashSet构造函数以提供一个比较器,它将允许您确保区分大小写/不区分大小写(取决于您的偏好)。

Distinct()打电话给你,让你可以摆脱。这不会像你调用它那样帮助你。