A SorteDictionary theo MSDN được sắp xếp trên khóa. Điều đó có nghĩa là bạn có thể chắc chắn rằng nó sẽ được sắp xếp khi bạn liệt kê nó trong một foreach? Hay nó chỉ có nghĩa là SortedDictionary hoạt động theo cách nội bộ để có hiệu suất tốt hơn trong các trường hợp khác nhau?C#: Là một SortedDictionary được sắp xếp khi bạn liệt kê nó?
Trả lời
Khi bạn liệt kê bộ sưu tập nó được sắp xếp theo phím (ngay cả khi bạn liệt kê nói bộ sưu tập Values
). Nội bộ bộ sưu tập được thực hiện như một cây tìm kiếm nhị phân (theo tài liệu). Cả việc chèn và tra cứu các giá trị là O (log n) (nghĩa là chúng khá hiệu quả).
Vâng, đó là chính xác những gì nó có nghĩa.
Edit: phần mà nói "Điều đó có nghĩa rằng bạn có thể chắc chắn rằng nó sẽ được sắp xếp khi bạn liệt kê nó trong một foreach?"
Từ điển được duy trì theo một thứ tự sắp xếp sử dụng một cây nội. Mỗi phần tử mới sẽ được đặt tại các vị trí loại chính xác, và cây là điều chỉnh để duy trì thứ tự sắp xếp bất cứ khi nào một yếu tố được lấy ra. Trong khi liệt kê, thứ tự sắp xếp là duy trì.
Nếu bạn liệt kê các mục trong một SortedDictionary
, các mục sẽ được trả lại theo thứ tự sắp xếp của các khóa mục. Và nếu bạn liệt kê các phím trong số SortedDictionary
, các phím cũng sẽ được trả lại theo thứ tự được sắp xếp. Và có lẽ hơi ngạc nhiên, nếu bạn liệt kê các SortedDictionary
bởi giá trị của nó, các giá trị được trả về trong thứ tự sắp xếp của các phím, không thứ tự sắp xếp của các giá trị như bạn mong đợi.
diễn:
Lưu ý rằng trong bản demo này các hạng mục bổ sung vào SortedDictionary
là không thêm vào trong thứ tự sắp xếp.
Ngoài ra, nếu bạn dự định liệt kê từ điển của mình theo giá trị của nó và có khả năng giá trị trùng lặp, hãy xem xét có chức năng tra cứu ngược lại return an IEnumerable<T>. (Tất nhiên, đối với các từ điển lớn, nhìn lên một chìa khóa bởi giá trị của nó có thể dẫn đến hiệu suất kém.)
using System;
using System.Collections.Generic;
using System.Linq;
class SortedDictionaryEnumerationDemo
{
static void Main()
{
var dict = new SortedDictionary<int, string>();
dict.Add(4, "Four");
dict.Add(5, "Five");
dict.Add(1, "One");
dict.Add(3, "Three");
dict.Add(2, "Two");
Console.WriteLine("== Enumerating Items ==");
foreach (var item in dict)
{
Console.WriteLine("{0} => {1}", item.Key, item.Value);
}
Console.WriteLine("\n== Enumerating Keys ==");
foreach (int key in dict.Keys)
{
Console.WriteLine("{0} => {1}", key, dict[key]);
}
Console.WriteLine("\n== Enumerating Values ==");
foreach (string value in dict.Values)
{
Console.WriteLine("{0} => {1}", value, GetKeyFromValue(dict, value));
}
}
static int GetKeyFromValue(SortedDictionary<int, string> dict, string value)
{
// Use LINQ to do a reverse dictionary lookup.
try
{
return
(from item in dict
where item.Value.Equals(value)
select item.Key).First();
}
catch (InvalidOperationException e)
{
return -1;
}
}
}
Dự kiến Output:
== Enumerating Items ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Keys ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Values ==
One => 1
Two => 2
Three => 3
Four => 4
Five => 5
- 1. Python - sắp xếp một danh sách liệt kê lồng nhau
- 2. Sắp xếp thứ tự khi sử dụng foreach trên một mảng, liệt kê vv
- 3. Sắp xếp một danh sách liệt kê theo chiều dài và theo giá trị
- 4. python: sắp xếp một danh sách liệt kê bởi một mục trong danh sách phụ chứa
- 5. Liệt kê trên một enum trong C++
- 6. Python: Liệt kê sắp xếp với nhiều thuộc tính và thứ tự hỗn hợp
- 7. Từ điển được sắp xếp đảo ngược?
- 8. Git: Liệt kê các chi nhánh git, sắp xếp theo (và hiển thị) ngày
- 9. Từ khóa được bảo lưu trong liệt kê trong C#
- 10. Hiệu quả nhận được các khoản được sắp xếp của một danh sách được sắp xếp
- 11. Sắp xếp một IList trong C#
- 12. Liệt kê ShortCigned được gán trong Excel
- 13. Bạn phải chọn ít nhất một Nền tảng được Liệt kê để hiển thị
- 14. Mã hóa không phải là một kiểu liệt kê?
- 15. Chỉ liệt kê các SubFolders trong C#?
- 16. "Sắp xếp ngăn xếp" là gì?
- 17. C# Lặp lại từ điển được sắp xếp theo giá trị
- 18. Tại sao tôi nên có một liệt kê được khai báo với một typedef trong C++?
- 19. KCFinder 'Bạn không có quyền liệt kê các tệp.'
- 20. Liệu Perl có một kiểu liệt kê?
- 21. Sắp xếp tệp bằng DirectoryIterator
- 22. Nhận ngoại lệ là "Bộ sưu tập bị đột biến trong khi được liệt kê"
- 23. Sắp xếp một NSMutableDictionary
- 24. đúng nhận được dữ liệu từ một (sắp xếp) JTable
- 25. dừng liệt kê khối cho một NSDictionary
- 26. Chuyển đổi một liệt kê thành Iterator
- 27. liệt kê hashset và xóa các phần tử từ nó
- 28. C# Cách sắp xếp danh sách được sắp xếp theo cột giá trị
- 29. SortedList so với SortedDictionary vs. Sort()
- 30. Java Enums: Liệt kê các giá trị được liệt kê từ một Class <? mở rộng Enum>
Mà một trong số họ? : p – Svish
Có đảm bảo rằng nó được sắp xếp? (so với từ điển thông thường, nơi nó không phải là) – Svish