我试图从我正在处理的浏览器列表中删除重复的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;
}
那么我可以通过另一种方式删除重复项吗?
答案 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()
打电话给你,让你可以摆脱。这不会像你调用它那样帮助你。