Tôi cần một HashSet lưu giữ thứ tự chèn, có bất kỳ triển khai nào trong khung này không?HashSet giữ nguyên thứ tự
Trả lời
Chuẩn .NET HashSet
không giữ lại thứ tự chèn. Để kiểm tra đơn giản, thứ tự chèn có thể được bảo quản do tai nạn, nhưng nó không được bảo đảm và sẽ không luôn hoạt động theo cách đó. Để chứng minh rằng nó là đủ để làm một số loại bỏ ở giữa.
Xem câu hỏi này để biết thêm thông tin về rằng: Does HashSet preserve insertion order?
tôi có một thời gian ngắn thực hiện một HashSet
mà đảm bảo trật tự chèn. Nó sử dụng Dictionary
để tra cứu các mục và LinkedList
để bảo vệ đơn đặt hàng. Tất cả ba công việc chèn, loại bỏ và tra cứu vẫn còn trong 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 không tuyên bố rằng 'HashSet
Các câu trả lời khác được đánh giá cao cho biết rằng việc đặt hàng được đưa ra "ngoài hộp". Bây giờ chúng được đánh giá thấp. Tôi sẽ sửa đổi văn bản của tôi và rephrase nó trung lập. –
Bạn nên thực sự cung cấp quá tải lấy một 'IEqualityComparer
Bạn có thể nhận được chức năng này dễ dàng bằng KeyedCollection<TKey,TItem>
quy định cụ thể đối số kiểu tương tự cho TKey và TItem:
public class OrderedHashSet<T> : KeyedCollection<T, T>
{
protected override T GetKeyForItem(T item)
{
return item;
}
}
Khi bạn gọi 'Remove', nó sẽ gọi [' Remove (T) '] (http://msdn.microsoft.com/en-us/library/ms132413 (v = vs.110) .aspx) hoặc ['Remove (TKey)'] (http://msdn.microsoft.com/en-us/library/ms132459 (v = vs.110) .aspx)? Đầu tiên là O (n) và thứ hai là O (1). –
Nó gọi là 'Remove (TKey)' bởi vì nó là một trong lớp có nguồn gốc cao nhất. Tuy nhiên, gọi Remove() khi bộ sưu tập được chọn làm Bộ sưu tập
Làm rõ thêm: Cả hai 'Xóa (T)' và 'Xoá (TKey)' là O (n) vì 'KeyedCollection
Nếu bạn cần phức tạp liên tục của Add
, Remove
, Contains
và bảo quản trật tự, sau đó không có bộ sưu tập như vậy trong .NET Framework 4.5.
Nếu bạn đang okay với mã bên thứ 3, hãy nhìn vào kho lưu trữ của tôi (giấy phép MIT dễ dãi): https://github.com/OndrejPetrzilka/Rock.Collections
Có OrderedHashSet<T>
bộ sưu tập:
- dựa trên mã nguồn cổ điển
HashSet<T>
(từ .NET Core) - bảo tồn thứ tự chèn vào và cho phép chỉnh sửa thủ công
- tính năng đảo ngược liệt kê
- có phức tạp hoạt động tương tự như
HashSet<T>
Add
vàRemove
hoạt động chậm hơn 20% so vớiHashSet<T>
- tiêu thụ hơn 8 byte bộ nhớ cho mỗi mục
- 1. Thứ tự lặp của HashSet
- 2. IOrderedEnumerable.Select() giữ nguyên thứ tự phần tử?
- 3. Thứ tự tổng hợp được xác định bởi người dùng SQL được giữ nguyên?
- 4. Giữ nguyên thứ tự phần tử khi băm nhỏ dữ liệu XML thành các hàng SQL
- 5. Thứ tự trong truy vấn phụ có được bảo đảm để được giữ nguyên không?
- 6. PLINQ có giữ nguyên thứ tự ban đầu trong một chuỗi không?
- 7. rbind hai data.frame giữ nguyên thứ tự hàng và tên hàng
- 8. Thứ tự của các phần tử trong danh sách JSON có được giữ nguyên không?
- 9. Linq Nơi chứa ... Giữ thứ tự mặc định
- 10. số thứ tự giữ chỗ này công thức excel
- 11. C + 11 Vùng chứa liên kết giữ thứ tự chèn?
- 12. Trình duyệt có giữ nguyên thứ tự các đầu vào có cùng tên trên GET/POST không?
- 13. Kết hợp hai bên trọng số tối đa, ràng buộc: thứ tự của từng biểu đồ được giữ nguyên
- 14. HashSet
- 15. css hướng rtl thứ tự nguyên tố vấn đề
- 16. Tìm thứ tự cao nhất 1 trong Java nguyên thủy
- 17. Sắp xếp tự nhiên mảng PHP theo thứ tự ngược lại và không giữ phím
- 18. Có công cụ nào để giữ các tệp nguồn C của tôi theo thứ tự không?
- 19. Đảo ngược thứ nguyên tùy ý trong một số thứ tự
- 20. Giữ lại thứ tự sắp xếp do người dùng xác định trong WPF DataGrid
- 21. Khóa chính của SQL composite không có thứ tự (cặp số nguyên theo thứ tự phải là duy nhất)
- 22. Nối tiếp chuỗi mã hóa Python bằng JSON, giữ lại các giá trị ký tự thứ tự
- 23. Chèn ngày bị thiếu trong khi giữ thứ tự ngày trong danh sách python
- 24. RewriteRule giữ nguyên tham số GET
- 25. Tệp TFS phải được giữ nguyên
- 26. C# Typedef giữ nguyên các thuộc tính
- 27. Tách ngày và giữ nguyên thời gian
- 28. Thứ tự MySQL được đánh giá theo thứ tự nào?
- 29. thứ tự một truy vấn mysql theo thứ tự abc
- 30. Tạo một HashSet cho đôi
Tôi tưởng tượng bạn có nghĩa là như [LinkedHashSet] của Java (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html) – thejoshwolfe
yeah the si mplest điều cần làm là để bọc một danh sách liên kết và hashset với nhau ... những gì tôi đã kết thúc làm trong quá khứ. hữu ích cho việc triển khai LRU –
Theo định nghĩa của Set, không nên giữ bất kỳ thứ tự nào. –