用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); } }