C#:IEnumerable<T>.HasDuplicates 的良好且高效的实现

标签 c# ienumerable implementation duplicates

有没有人有一个好的、有效的扩展方法来查找一系列项目是否有重复项?

我想我可以将 return subjects.Distinct().Count() == subjects.Count() 放入扩展方法中,但感觉应该有更好的方法。该方法必须对元素进行两次计数并整理出所有不同的元素。更好的实现应该在它找到的第一个重复项上返回 true。有什么好的建议吗?

我想大纲可能是这样的:

public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
    return subjects.HasDuplicates(EqualityComparer<T>.Default);
}

public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
    ...
}

但不太确定如何巧妙地实现它...

最佳答案

public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
    return HasDuplicates(subjects, EqualityComparer<T>.Default);
}

public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
    HashSet<T> set = new HashSet<T>(comparer);
    foreach (T item in subjects)
    {
        if (!set.Add(item))
            return true;
    }

    return false;
}

关于C#:IEnumerable<T>.HasDuplicates 的良好且高效的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134180/

相关文章:

c# - 为什么设置字段比获取字段慢很多倍?

c# - 为什么 .NET 对象有方法 Finalize()?

c# - 检索 IEnumerable 的方法参数

c# - IEnumerable 问题 : Best performance?

vhdl - 综合translate_off如何工作?

c++ - 这段代码“长度指示器实现”有什么问题?

c# - SQL Server 相当于 Oracle 'table of integer'

c# - 最优雅的生成素数的方法

c# - 当我的类多次实现 IEnumerable<T> 时,为什么我不能使用 LINQ to Objects?

c++ - FIR滤波器(实现)