从列表中删除重复值的最快方法是什么。 假设 List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };所以我对使用 lambda 去除重复并返回很感兴趣: {1, 2, 3, 4, 5}。你的建议是什么?
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
{1, 2, 3, 4, 5}
方法。它应该可以工作。
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; var distinctList = longs.Distinct().ToList();
获得 新的列表最简单的方法是:
List<long> unique = longs.Distinct().ToList();
这对您来说足够好了吗,还是需要改变 存在列表?后者显然更为冗长。
请注意,Distinct()不是 保证来保持原来的顺序,但是在当前的实现中它会保持原来的顺序-这是最 自然的实现。有关详细信息,请参阅我的 关于 Distinct()的 Edulinq 博客文章。
Distinct()
如果你不需要它成为一个 List<long>,你可以保持它是:
List<long>
IEnumerable<long> unique = longs.Distinct();
在这一点上,每次迭代 unique时都会经历反欺骗过程。这是否好将取决于您的需求。
unique
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
如果你想坚持使用原来的 List 而不是创建一个新的 List,你可以使用类似于 Distinct()扩展方法内部所做的事情,比如使用 HashSet 来检查唯一性:
HashSet<long> set = new HashSet<long>(longs.Count); longs.RemoveAll(x => !set.Add(x));
List 类提供了这种方便的 RemoveAll(predicate)方法,它删除所有不满足谓词指定条件的元素。谓词是接受列表元素类型参数并返回 bool 值的委托。HashSet 的 Add()方法只有在集合尚未包含该项时才返回 true。因此,通过从列表中删除任何不能添加到集合中的项,可以有效地删除所有重复项。
RemoveAll(predicate)
Add()
可以对包含更复杂类型的可枚举数使用此扩展方法:
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))); }
就位:
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); } }
一个简单直观的实现
public static List<PointF> RemoveDuplicates(List<PointF> listPoints) { List<PointF> result = new List<PointF>(); for (int i = 0; i < listPoints.Count; i++) { if (!result.Contains(listPoints[i])) result.Add(listPoints[i]); } return result; }