您永远不会检查列表的最后一个元素,您的第二个 for 需要更改为此才能工作:
for (int j = 0; j < AuthorCounter; j++)
您正在检查每对节点两次。首先检查 i = 0 和 j = 1 的时间,然后检查 i = 1 和 j = 0 的时间。不需要在 i 之前或等于 i 之前开始 j。当 i = 0 时,您的内部循环将删除该元素的所有重复项,以便您知道AuthorGroupNodes.Nodes[0]
是唯一的。下次通过外循环时,您将确定它AuthorGroupNodes.Nodes[1]
是独一无二的。因此,您可以从 j 等于 i + 1 开始,然后取消对 i == j 的检查。同样,当您删除节点时, j 仍会增加到下一个节点。这将跳过 j 处的新节点,这是您删除的节点之后的节点,因此您应该减少 j,或者如果您不删除节点,则只增加 j:
for (int j = i + 1; j < AuthorCounter;)
{
if (AuthorGroupNode.Nodes[i].Text == AuthorGroupNode.Nodes[j].Text)
{
AuthorGroupNode.Nodes[j].Remove();
AuthorCounter--;
}
else
{
j++;
}
}
您说这可行但并不完美,所以我假设您没有使用标准列表,并且您的节点使用 Remove() 方法处理自己从列表中的删除。
如果列表按您要比较的字段排序,则可以完全删除内部 for 循环并删除当前元素的任何重复项,直到找到不同的元素:
for (int i = 0; i < AuthorCounter-1;)
{
if (AuthorGroupNode.Nodes[i].Text == AuthorGroupNode.Nodes[i + 1].Text)
{
AuthorGroupNode.Nodes[i].Remove();
AuthorCounter--;
}
else
{
i++;
}
}