삽입 순서를 유지하는 HashSet이 필요합니다. 프레임 워크에이 구현이 있습니까?순서를 유지하는 HashSet
답변
표준 .NET HashSet
은 삽입 순서를 유지하지 않습니다. 간단한 테스트의 경우 삽입 주문은 사고로 인해 보존 될 수 있지만 보장되지는 않으며 항상 그런 식으로 작동하지는 않습니다. 그 사이에 몇 가지 제거 작업을 수행하는 것만으로 충분하다는 것을 입증합니다.
는에 대한 자세한 내용은이 질문을 참조하십시오 : Does HashSet preserve insertion order?
나는 간단히 삽입 순서를 보장하는 HashSet
을 구현했습니다. 항목을 조회하는 데 Dictionary
을 사용하고 순서를 유지하려면 LinkedList
을 사용합니다. 3 가지 삽입, 제거 및 검색 작업은 모두 O (1)에서 계속 수행됩니다.
public class OrderedSet<T> : ICollection<T>
{
private readonly IDictionary<T, LinkedListNode<T>> m_Dictionary;
private readonly LinkedList<T> m_LinkedList;
public OrderedSet()
: this(EqualityComparer<T>.Default)
{
}
public OrderedSet(IEqualityComparer<T> comparer)
{
m_Dictionary = new Dictionary<T, LinkedListNode<T>>(comparer);
m_LinkedList = new LinkedList<T>();
}
public int Count
{
get { return m_Dictionary.Count; }
}
public virtual bool IsReadOnly
{
get { return m_Dictionary.IsReadOnly; }
}
void ICollection<T>.Add(T item)
{
Add(item);
}
public bool Add(T item)
{
if (m_Dictionary.ContainsKey(item)) return false;
LinkedListNode<T> node = m_LinkedList.AddLast(item);
m_Dictionary.Add(item, node);
return true;
}
public void Clear()
{
m_LinkedList.Clear();
m_Dictionary.Clear();
}
public bool Remove(T item)
{
LinkedListNode<T> node;
bool found = m_Dictionary.TryGetValue(item, out node);
if (!found) return false;
m_Dictionary.Remove(item);
m_LinkedList.Remove(node);
return true;
}
public IEnumerator<T> GetEnumerator()
{
return m_LinkedList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public bool Contains(T item)
{
return m_Dictionary.ContainsKey(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
m_LinkedList.CopyTo(array, arrayIndex);
}
}
OP는'HashSet
다른 주문에 대해서는 "out of box"라고 명시된 높은 대답이있었습니다. 이제 이들은 낮추어 져 있습니다. 나는 내 텍스트를 수정하고 그것을 중성으로 바꿀 것이다. –
실제로'IEqualityComparer '을 과부하로하여'IDictionary
쉽게 TKEY 및 TITEM에 대해 동일한 유형의 인수 지정 KeyedCollection<TKey,TItem>
을 사용하여이 기능을 얻을 수 있습니다 : 당신이 Add
, Remove
, Contains
및 주문 보존 일정 복잡성을해야하는 경우
public class OrderedHashSet<T> : KeyedCollection<T, T>
{
protected override T GetKeyForItem(T item)
{
return item;
}
}
'Remove '를 호출하면 [Remove (T)] (http://msdn.microsoft.com/en-us/library/ms132413(v=vs.110) .aspx) 또는 ['Remove (TKey)'] (http://msdn.microsoft.com/en-us/library/ms132459 (v = vs.110) .aspx)? 첫 번째는 O (n)이고 두 번째는 O (1)입니다. –
가장 파생 된 클래스의 클래스이기 때문에'Remove (TKey) '를 호출합니다. 그러나 콜렉션이 콜렉션
또 다른 설명 :'KeyedCollection
을 한 후 아무 없다 .NET Framework 4.5에서 이러한 컬렉션.
당신이 제 3 자 코드 괜찮아, 내 저장소 (허용 MIT 라이센스)를 살펴 : 고전 HashSet<T>
소스 코드를 기반으로
- (에서 : https://github.com/OndrejPetrzilka/Rock.Collections
OrderedHashSet<T>
수집있다 .NET 코어) - 보존 삽입 순서 및 수동 재주문 열거
- 반전
- 기능 동일한 동작 복잡성
HashSet<T>
같은 Add
및Remove
작업HashSet<T>
- 는 I 상상
- 1. SqlBulkCopy로 행 순서를 유지하는 방법?
- 2. 삽입 순서를 유지하는 콜렉션을 설정하십시오.
- 3. IEnumarable 컬렉션에서 항목을 수정하고 순서를 유지하는 방법
- 4. 문자열을 사전 편집 순서를 유지하는 숫자로 매핑하십시오.
- 5. ggplot2 heatmap : 레이블 순서를 유지하는 방법은 무엇입니까?
- 6. invokation chain에서 순서를 유지하는 "유창한 인터페이스"
- 7. 관련 레코드가 HashSet 또는 SortedSet에로드됩니까?
- 8. HashSet 조회 복잡성?
- 9. C# 목록으로의 변환 Hashset
- 10. HashSet 이클립스 디버거 변수
- 11. C# 2.0의 HashSet 대체
- 12. 중복을 허용하지 않고 입력 순서를 유지하는 데이터 구조가 있습니까?
- 13. 특정 속성을 기반으로 정렬 된 순서를 유지하는 컬렉션 클래스?
- 14. GORM에서 디스플레이 목적으로 'hasMany'필드의 순서를 유지하는 방법은 무엇입니까?
- 15. stdout 및 stderr를 리디렉션하고 순서를 유지하는 방법은 무엇입니까?
- 16. 명명 된 튜플을 값 목록으로 변환하고 속성 순서를 유지하는 방법?
- 17. Django 문서 개정 시스템에서 단락 순서를 유지하는 방법은 무엇입니까?
- 18. WPF ItemsControl에서 항목의 정렬 순서를 유지하는 방법은 무엇입니까?
- 19. WPF에서 ObservableCollection과 함께 HashSet 사용
- 20. HashSet, Vector, LinkedList의 최대 크기
- 21. HashSet() 함수 데이터를 순차적으로 정렬하는 방법은 무엇입니까?
- 22. Java Collections API HashSet 제거 방법
- 23. 3.5와 호환되는 C# 2.0에서 HashSet 사용
- 24. HashSet <String>에서 String []
- 25. 문자열 배열의 요소에 대한 HashSet 검색
- 26. HashSet 용 무작위 시작 인덱스 반복기
- 27. HashSet <T>을 .NET의 배열
- 28. 일치하는 순서를 % /?
- 29. 배열이나 목록의 항목이 순서를 유지합니까?
- 30. 왜 'toSet'메서드는 ListBuffer의 요소 순서를 섞어서 사용합니까?
항목 당 메모리의 8 개의 바이트를 소모에 비해 20 % 느린 갖는다 당신은 자바의 [LinkedHashSet] (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html)과 같은 뜻이다 – thejoshwolfe
예 mplest 할 일은 연결된리스트와 해쉬 셋을 함께 감싸는 것입니다. LRU 구현에 유용함 –
Set의 정의에 따라 순서를 유지하면 안됩니다. –