5

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

猜猜我可以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)
{
    ...
}

但不太确定它的智能实现会如何......

4

3 回答 3

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;
}
于 2009-07-15T21:26:45.337 回答
4

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

public static bool HasDuplicates<T>(this IEnumerable<T> sequence, IEqualityComparer<T> comparer = null) {
    var set = new HashSet<T>(comparer);
    return !sequence.All(item => set.Add(item));
}
于 2010-06-03T20:34:28.287 回答
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;
    }
  }
}
于 2009-07-15T21:27:29.267 回答