C#:IEnumerable <t> .HasDuplicates </t>的高效实现

时间:2009-07-15 21:23:46

标签: 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)
{
    ...
}

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:4)

这是生产代码。效果很好:

public static bool HasDuplicates<T>(this IEnumerable<T> sequence) {
    var set = new HashSet<T>();
    return !sequence.All(item => set.Add(item));
}

答案 2 :(得分:1)

我认为最简单的扩展方法如下。

public static bool HasDuplicates<T>(this IEnumerable<T> enumerable) {
  var hs = new HashSet<T>();
  foreach ( var cur in enumerable ) {
    if ( !hs.Add(cur) ) {
      return false;
    }
  }
}