最快的方式从列表中<>通过拉姆达删除重复的值最快的方式从列表中<>通过拉姆达

2019-05-14 07:06发布

什么是从列表中删除重复值最快的方法。 假定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