C#:IEnumerable <T> .HasDuplicates的一个好的和有效的实现

Svi*_*ish 4 c# ienumerable implementation duplicates

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

我猜我可以return subjects.Distinct().Count() == subjects.Count()使用扩展方法,但有点觉得应该有更好的方法.该方法必须对元素进行两次计数并整理所有distict元素.更好的实现应该在它找到的第一个副本上返回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)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*ell 13

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;
}
Run Code Online (Sandbox Code Playgroud)