【问题标题】:C#: A good and efficient implementation of IEnumerable<T>.HasDuplicatesC#:IEnumerable<T>.HasDuplicates 的良好且高效的实现
【发布时间】:2009-07-15 21:23:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# ienumerable implementation duplicates


    【解决方案1】:
    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;
    }
    

    【讨论】:

    • 现在看到 那个 非常聪明......必须尝试一下!
    • 这可能很方便...不过我认为紧凑框架中不支持 HashSet...grrrrr。
    • 你可以用Dictionary&amp;lt;T,K&amp;gt;做同样的事情,但它的内存效率有点低。 Dictionary&amp;lt;T,K&amp;gt;.Add 不会返回 bool,但它的 Count 属性检查起来会非常快,但需要多几行代码。
    【解决方案2】:

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

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

    【讨论】:

    • 看起来与我接受的答案几乎相同,只是要短一些。有趣:)
    • 是的,方法与第一个答案相同(来自 280Z28);不是故意的。
    【解决方案3】:

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

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

    【讨论】:

    • 认为缺少一个返回语句,以及返回它应该返回的对立面?无论如何,与其他答案非常相似,并且您有足够的代表,因此接受了其他答案;p
    猜你喜欢
    • 2010-10-10
    • 2014-12-04
    • 2011-01-09
    • 1970-01-01
    • 2012-02-04
    • 2012-07-03
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多