什么是从列表中删除重复值最快的方法。 假定List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
于是我在使用拉姆达有趣去除重复和返回: {1, 2, 3, 4, 5}
什么是您的建议?
Answer 1:
得到一个新的列表,最简单的方法是:
List<long> unique = longs.Distinct().ToList();
那是对你不够好,或者你需要变异现有列表? 后者是显著更啰嗦。
需要注意的是Distinct()
不能保证保留原始顺序,但在当前执行它会-这就是最自然的实现。 见我Edulinq博客文章Distinct()
了解更多信息。
如果你不需要它是一个List<long>
,你可以只把它作为:
IEnumerable<long> unique = longs.Distinct();
在这一点上它会经过去欺骗你迭代,每次unique
虽然。 不管是好还是不好,将取决于您的要求。
Answer 2:
您可以使用含有更复杂的类型可枚举此扩展方法:
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)));
}
Answer 3:
这里有一个明显()方法。 它应该工作。
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
Answer 4:
如果你想与原来的列表坚持创建一个新的,可以类似什么东西,而不是Distinct()
扩展方法在内部做,即用一个HashSet来检查的独特性:
HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));
List类提供这种方便RemoveAll(predicate)
那滴不满足由谓词所指定的条件的所有元素的方法。 谓词是一个委托以列表的元素类型的参数并返回一个bool值。 HashSet中的Add()
只有在集中不包含的项目还没有方法返回true。 因此,通过去除不能被添加到您设定有效去除所有重复列表中的任何项目。
Answer 5:
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
Answer 6:
一个简单直观的实现
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;
}
Answer 7:
到位:
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);
}
}
文章来源: Fastest way to Remove Duplicate Value from a list<> by lambda