从列表中删除重复值的最佳算法

Itz*_*had 5 c# algorithm list duplicate-removal

从列表中删除重复值的最佳算法是什么?我试过这个:

for (int i = 0; i < AuthorCounter-1; i++)
{
    for (int j = 0; j < AuthorCounter-1; j++)
    {
        if (i != j)
        {
            if (AuthorGroupNode.Nodes[i].Text == AuthorGroupNode.Nodes[j].Text)
            {
                AuthorGroupNode.Nodes[j].Remove();
                AuthorCounter--;
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

AuthorGroupNodes是节点上的列表.它在某种程度上做得对,但并不完美.谁有更好的解决方案???

Eri*_* J. 6

您当前的算法是O(N平方),对于大型列表,它的性能非常差.

如果空间不是问题,您可以保留HashSet<int>节点的哈希值.遍历列表一次.如果节点的哈希值在HashSet中,则您知道这是一个重复节点.跳过它.如果散列不在HashSet中,请将此节点添加到新列表,并将节点的散列添加到HashSet.

这将执行O(N),并且需要内存用于原始列表,列表的副本减去任何重复项以及HashSet.该算法是非破坏性的.

如果你可以使用Linq,那就干嘛

var distinctList = originalList.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

UPDATE

发现这几乎就是Jon Skeet重新实施Distinct的方式.

public static IEnumerable<TSource> Distinct<TSource>( 
    this IEnumerable<TSource> source) 
{ 
    return source.Distinct(EqualityComparer<TSource>.Default); 
} 

public static IEnumerable<TSource> Distinct<TSource>( 
    this IEnumerable<TSource> source, 
    IEqualityComparer<TSource> comparer) 
{ 
    if (source == null)  
    { 
        throw new ArgumentNullException("source"); 
    } 
    return DistinctImpl(source, comparer ?? EqualityComparer<TSource>.Default); 
} 

private static IEnumerable<TSource> DistinctImpl<TSource>( 
    IEnumerable<TSource> source, 
    IEqualityComparer<TSource> comparer) 
{ 
    HashSet<TSource> seenElements = new HashSet<TSource>(comparer); 
    foreach (TSource item in source) 
    { 
        if (seenElements.Add(item)) 
        { 
            yield return item; 
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-14-distinct/