답변:
HashSet 사용해보기 :
HashSet (Of T) 클래스는 고성능 세트 작업을 제공합니다. 집합은 중복 요소가없고 특정 순서가 아닌 컬렉션입니다.
HashSet (Of T) 객체의 용량은 객체가 보유 할 수있는 요소의 수입니다. 요소가 객체에 추가되면 HashSet (Of T) 객체의 용량이 자동으로 증가합니다.
HashSet (Of T) 클래스는 수학 집합의 모델을 기반으로하며 Dictionary (Of TKey, TValue) 또는 Hashtable 컬렉션 의 키에 액세스하는 것과 유사한 고성능 집합 작업을 제공합니다 . 간단히 말해서 HashSet (Of T) 클래스는 값이없는 Dictionary (Of TKey, TValue) 컬렉션 으로 생각할 수 있습니다 .
HashSet (Of T) 컬렉션은 정렬되지 않으며 중복 요소를 포함 할 수 없습니다 ...
.NET 3.5를 사용하는 경우을 사용할 수 있습니다 HashSet<T>
. .NET이 Java뿐만 아니라 세트를 제공하지 않는다는 것은 사실입니다.
인 Wintellect의 PowerCollections는 너무 도움이 될 수 있습니다.
.NET 4.0 이상을 사용하는 경우 :
정렬이 필요한 경우을 사용하십시오 SortedSet<T>
. 그렇지 않으면 검색 하지 않고 조작 하기 HashSet<T>
때문에 사용하지 마십시오 O(1)
. 반면 에 검색 및 조작 SortedSet<T>
은 O(log n)
조작 할 수 있습니다.
나는 Iesi.Collections를 사용합니다 http://www.codeproject.com/KB/recipes/sets.aspx
그것은 많은 OSS 프로젝트에서 사용되었으며, 처음에는 NHibernate에서 발견되었습니다.
CodePlex 에서 PowerCollections 를 살펴보십시오 . Set 및 OrderedSet 외에도 Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary 및 OrderedMultiDictionary와 같은 유용한 컬렉션 유형이 몇 가지 있습니다.
더 많은 콜렉션을 위해 C5 Generic Collection Library도 있습니다.
나는 이것이 오래된 스레드라는 것을 알고 있지만 동일한 문제가 발생했으며 동일한 시드가 주어지면 GetHashCode ()가 다른 코드를 반환했기 때문에 HashSet이 매우 신뢰할 수 없다는 것을 알았습니다. 그래서 List를 사용하고 이와 같은 add 메소드를 숨기지 않는 이유는 무엇입니까?
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
List는 동등성을 결정하기 위해서만 Equals 메소드를 사용하기 때문에 원하는 결과를 얻을 수 있도록 T 유형에서 Equals 메소드를 정의 할 수 있습니다.
List.Contains
는 O(n)
복잡 하기 때문에 Add
메서드가 O(n)
복잡해 지기 때문 입니다 . 내부 수집을 가정하면, 크기를 조정할 필요가 없습니다 Add
모두 List
와 HashMap
이어야 O(1)
복잡성. TLDR : 작동하지만 해킹이 덜되고 효율성이 떨어집니다.