5

アイテムのシーケンスに重複があるかどうかを見つけるための優れた効率的な拡張方法を持っている人はいますか?

拡張メソッドを導入できると思いreturn subjects.Distinct().Count() == subjects.Count()ますが、もっと良い方法があるはずだと感じています。この方法では、要素を2回カウントし、すべての離れた要素を分類する必要があります。より良い実装は、最初に見つかった重複に対して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 に答える