C#: ienumerable의 훌륭하고 효율적인 구현 .
-
16-09-2019 - |
문제
일련의 항목에 복제물이 있는지 찾기위한 우수하고 효율적인 확장 방법이 있습니까?
내가 넣을 수있을 것 같아요 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;
}
}
}
제휴하지 않습니다 StackOverflow