リストの最後の要素をチェックすることはありません。2番目の for を機能させるには、次のように変更する必要があります。
for (int j = 0; j < AuthorCounter; j++)
ノードの各ペアを 2 回チェックしています。最初に i = 0 および j = 1 の場合を確認し、次に i = 1 および j = 0 の場合を確認します。j を i の前または i と同じで開始する必要はありません。i = 0 の場合、内側のループはその要素のすべての重複を削除するため、一意であることがわかりますAuthorGroupNodes.Nodes[0]
。次回外側のループを通過すると、それAuthorGroupNodes.Nodes[1]
が一意であることを確認できます。したがって、i + 1 に等しい j から始めて、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++;
}
}