본문 바로가기
C#

[C#] HashSet<T>, SortedSet<T>

by DANEW 2023. 9. 16.

HashSet<T> 클래스

 

HashSet<T> 클래스 (System.Collections.Generic)

값 집합을 나타냅니다.

learn.microsoft.com

.NET 3.5

 

- ISet<T> 인터페이스에 기반

- Contains 메서드는 해시 기반 조회(Hash-Based Lookup)를 이용해서 빠르게 실행 됨

- 중복된 원소를 저장하지 않음(수학에서의 집합-Set)

- 색인으로 특정 원소에 접근 할 수 없음

 

- 키들을 저장하는 해시테이블로 구성

 

* SymmetricExceptWith 메서드

 - 책에는 두 집합에 모두 있는 원소들을 첫 집합에서 제거한다 라고 적혀있어서 좀 햇갈렸음

 - 대칭차집합인데, 두 집합에서 두 집합의 교집합을 제외한 합집합이라고 생각하면 될 것 같음

반응형
namespace System.Collections.Generic
{
    public class HashSet<T> : ICollection<T>, IEnumerable<T>, IEnumerable, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>
    {
        // 생성자
        public HashSet();
        public HashSet(IEqualityComparer<T> comparer);  // 상등 비교자 설정(중복되는 것은 포함하지 않으므로)
        public HashSet(IEnumerable<T> collection);      // 다른 형식의 집합(또는 컬렉션)을 인자로 받음
        public HashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer);
        protected HashSet(SerializationInfo info, StreamingContext context);
 
        // 상등 비교자
        public IEqualityComparer<T> Comparer { get; }
        public static IEqualityComparer<HashSet<T>> CreateSetComparer();
 
        // 집합 정보
        public int Count { get; }
 
        // 추가 삭제
        public bool Add(T item);
        public void Clear();
        public bool Remove(T item);
        public int RemoveWhere(Predicate<T> match);
 
        // 검색
        public bool Contains(T item);
 
        // 집합 연산
        public void UnionWith(IEnumerable<T> other);            // 합집합, 원소 추가
        public void IntersectWith(IEnumerable<T> other);        // 교집합, 원소 제거
        public void ExceptWith(IEnumerable<T> other);           // 차집합, 원소 제거                
        public void SymmetricExceptWith(IEnumerable<T> other);  // 대칭차집합, 원소 제거
 
        // 집합에 대한 질의 수행
        public bool IsProperSubsetOf(IEnumerable<T> other);     // 진부분집합
        public bool IsProperSupersetOf(IEnumerable<T> other);   // 진상위집합(진초집합)
        public bool IsSubsetOf(IEnumerable<T> other);           // 부분집합
        public bool IsSupersetOf(IEnumerable<T> other);         // 상위집합(초집합)
        public bool Overlaps(IEnumerable<T> other);             // 겹치는 원소가 있는지 체크
        public bool SetEquals(IEnumerable<T> other);            // 서로 같은지(포함한 원소가 같은지) 체크
       
        // 복사
        public void CopyTo(T[] array, int arrayIndex);
        public void CopyTo(T[] array, int arrayIndex, int count);
        public void CopyTo(T[] array);
 
        // 열거
        public Enumerator GetEnumerator();
 
        public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
        {
            public T Current { get; }
            public void Dispose();
            public bool MoveNext();
        }
 
        // 직렬화
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context);
        public virtual void OnDeserialization(object sender);
       
        // 공간 정리
        public void TrimExcess();  
    }
}

SortedSet<T> 클래스

 

SortedSet<T> 클래스 (System.Collections.Generic)

정렬된 순서대로 유지 관리되는 개체의 컬렉션을 나타냅니다.

learn.microsoft.com

- .NET 4.0

- HashSet<T>과 비슷한 특성을 가짐

 

- 원소들을 정렬된 순서로 저장함

- 적흑 트리를 통하여 구현

// 상등 비교자가 아닌 일반 비교자를 지원하는 생성자 제공
public SortedSet(IComparer<T> comparer);
public SortedSet(IEnumerable<T> collection, IComparer<T> comparer);
 
// 최소, 최대
public T Max { get; }
public T Min { get; }
 
// 두 범위 사이의 원소들을 추출
public virtual SortedSet<T> GetViewBetween(T lowerValue, T upperValue);
 
// 순서를 뒤집음
public IEnumerable<T> Reverse();

 

반응형