从列表中删除重复值的最快方法<>由lambda

时间:2012-05-17 09:12:20

标签: c# list c#-4.0 lambda generic-list

从列表中删除重复值的最快方法是什么。 假设List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };所以我很有兴趣使用lambda删除重复并返回:{1, 2, 3, 4, 5}。你的建议是什么?

7 个答案:

答案 0 :(得分:123)

获取列表的最简单方法是:

List<long> unique = longs.Distinct().ToList();

这对您来说是否足够好,或者您是否需要改变现有的列表?后者显然更加冗长。

请注意,Distinct()不是保证来保留原始订单,但在当前实现中它将 - 并且这是自然实现。有关详细信息,请参阅我的Edulinq blog post about Distinct()

如果您不需要它为List<long>,则可以将其保留为:

IEnumerable<long> unique = longs.Distinct();

此时,每次迭代unique时,它都将进行重复数据删除。这是好还是不取决于你的要求。

答案 1 :(得分:78)

您可以将此扩展方法用于包含更复杂类型的枚举:

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

答案 2 :(得分:6)

有Distinct()方法。它应该有效。

List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();

答案 3 :(得分:6)

如果你想坚持使用原始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。因此,通过从列表中删除无法添加到集合中的任何项目,您可以有效地删除所有重复项。

答案 4 :(得分:2)

List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();

答案 5 :(得分:1)

简单直观的实施

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

答案 6 :(得分:-2)

在就地:

os.path