用lambda从列表<>中删除重复值的最快方法

什么是从列表中删除重复值的最快方法。 假设List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; 所以我很有趣的使用lambda删除重复并返回: {1, 2, 3, 4, 5} 。 你有什么build议?

获得清单最简单的方法是:

 List<long> unique = longs.Distinct().ToList(); 

这对你来说足够好吗?还是你需要改变现有的列表? 后者明显更啰嗦。

请注意, Distinct()保证保持原始顺序,但在当前的实现中它将会 – 这是最自然的实现。 查看我的Edulinq博客文章有关Distinct()的更多信息。

如果你不需要它是一个List<long> ,你可以保留它:

 IEnumerable<long> unique = longs.Distinct(); 

在这一点上,每次迭代都会通过去重复。 不pipe好坏取决于你的要求。

对于包含更复杂types的枚举,可以使用此扩展方法:

 IEnumerable<Foo> distinctList = sourceList.DistinctBy(x => x.FooName); public static IEnumerable<TSource> DistinctBy<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { var knownKeys = new HashSet<TKey>(); return source.Where(element => knownKeys.Add(keySelector(element))); } 

有Distinct()方法。 它应该工作。

 List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; var distinctList = longs.Distinct().ToList(); 

如果你想坚持原来的List,而不是创build一个新的,你可以类似于Distinct()扩展方法在内部做的事情,即使用HashSet来检查唯一性:

 HashSet<long> set = new HashSet<long>(longs.Count); longs.RemoveAll(x => !set.Add(x)); 

List类提供了这种方便的RemoveAll(predicate)方法,它删除所有不满足由谓词指定的条件的元素。 谓词是一个代表列表的元素types的参数,并返回一个布尔值。 HashSet的Add()方法仅在该集合尚未包含该项目时才返回true。 因此,通过从列表中删除任何不能添加到集合中的项目,可以有效地删除所有重复项目。

 List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList(); 

到位:

  public static void DistinctValues<T>(List<T> list) { list.Sort(); int src = 0; int dst = 0; while (src < list.Count) { var val = list[src]; list[dst] = val; ++dst; while (++src < list.Count && list[src].Equals(val)) ; } if (dst < list.Count) { list.RemoveRange(dst, list.Count - dst); } }