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是节点上的列表.它在某种程度上做得对,但并不完美.谁有更好的解决方案???
您当前的算法是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/