从列表中删除重复值的最快方法是什么。假设List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
因此我在使用lambda删除重复并返回时很有趣:{1, 2, 3, 4, 5}
。你有什么建议?
Answers:
获取新列表的最简单方法是:
List<long> unique = longs.Distinct().ToList();
这对您来说足够好了吗,还是您需要更改现有列表?后者的作用要大得多。
请注意,Distinct()
不能保证保留原始顺序,但是在当前实现中,它将保留-这是最自然的实现。有关更多信息,请参见我的Edulinq博客文章Distinct()
。
如果您不需要将其设为List<long>
,则可以将其保留为:
IEnumerable<long> unique = longs.Distinct();
此时,每次您进行迭代时,它将进行重复数据删除unique
。这是否好取决于您的要求。
longs = longs.Distinct().ToList()
是正确的。对?
var newTmpList = longs.Distinct().ToList(); longs.Clear(); longs.AddRange(newTmpList);
long = long.Distinct().ToList();
您可以对包含更复杂类型的枚举使用此扩展方法:
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()
不),因此可以轻松地将其用于其他数据类型,而无需实现Equals
/GetHashCode
或IEqualityComparer
如果要坚持使用原始List而不是创建一个新List,则可以执行类似于Distinct()
扩展方法在内部执行的操作的方法,即使用HashSet检查唯一性:
HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));
List类提供了这种方便的RemoveAll(predicate)
方法,该方法删除所有不满足谓词指定条件的元素。谓词是使用列表元素类型的参数并返回布尔值的委托。HashSet的Add()
方法仅在集合尚不包含该项的情况下才返回true。因此,通过从列表中删除所有无法添加到集合中的项目,可以有效地删除所有重复项。
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
简单直观的实现
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;
}
到位:
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);
}
}
longs.Distinct()
?