문제

일련의 항목에 복제물이 있는지 찾기위한 우수하고 효율적인 확장 방법이 있습니까?

내가 넣을 수있을 것 같아요 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)
{
    ...
}

그러나 스마트 한 구현이 어떻게 될지 확실하지 않습니다 ...

도움이 되었습니까?

해결책

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

다른 팁

이것은 생산 코드에 있습니다. 잘 작동합니다 :

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

가장 간단한 확장 방법은 다음과 같습니다.

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;
    }
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top