Tôi có thể sử dụng TEnumerator để đi qua TDictionary của tôi theo thứ tự sắp xếp theo khóa như thế nào?Làm thế nào tôi có thể liệt kê một TDictionary trong thứ tự chữ cái bằng khóa trong Delphi 2009?
Tôi đã có một cái gì đó như thế này:
var
Dic: TDictionary<string, string>;
Enum: TPair<string, string>;
begin
Dic := TDictionary<string, string>.create;
Dic.Add('Tired', 'I have been working on this too long');
Dic.Add('Early', 'It is too early in the morning to be working on this');
Dic.Add('HelpMe', 'I need some help');
Dic.Add('Dumb', 'Yes I know this example is dumb');
{ I want to do the following but do it in sorted order by Enum.Key }
for Enum in Dic do
some processing with Enum.Key and Enum.Value;
Dic.Free;
end;
Vì vậy, tôi muốn để xử lý từ điển của tôi theo thứ tự: Dumb, sớm, HelpMe, mệt mỏi.
Thật không may sự giúp đỡ Delphi là rất tối thiểu trong mô tả cách điều tra viên nói chung và TEnumerator cụ thể hoạt động và không đưa ra ví dụ mà tôi có thể tìm thấy. Ngoài ra còn có rất ít được viết trên web về việc sử dụng Enumerators with Generics trong Delphi.
Và mã mẫu của tôi ở trên thậm chí không sử dụng Bộ đếm số, vì vậy tôi nhầm lẫn về cách thiết kế này được thiết kế để sử dụng.
Cảm ơn Barry, cho câu trả lời của bạn.
Việc mạo hiểm của tôi vào Generics vì tôi đã đặt câu hỏi thú vị. Tôi muốn bắt đầu thực hiện chúng trong mã của tôi. Vấn đề "phân loại" hơi phức tạp, vì dường như Generics dường như có các phương thức xử lý phân loại được xây dựng, nhưng không có ví dụ hay tài liệu hay về cách thực hiện nó.
Cuối cùng, tôi đã làm những gì Barry đề xuất và xây dựng một chỉ mục bên ngoài thành Từ điển. Tuy nhiên, nó không cảm thấy đúng.
Tuy nhiên, sau đó tôi đã có một bất ngờ khác: Tôi đã cố gắng thay thế Gabr 's GPStringHash bằng TDictionary của Generic. Các mã đã được một chút sạch hơn với Generics. Nhưng điểm mấu chốt là TDictionary chậm hơn 3 lần so với Gabr. 1.704,667 cuộc gọi tới TryGetValue mất 45 giây, nhưng hoạt động tương tự đối với các thói quen của Gabr mất 12 giây. Tôi không chắc chắn tại sao, nhưng có lẽ nó đơn giản như Gabr có một hàm Hash nhanh hơn và kết hợp thay đổi. Hoặc có lẽ các generics đã phải khái quát hóa cho mọi trường hợp và vốn đã làm chậm nó xuống.
Không bao giờ-ít hơn, có thể Barry hoặc các nhà phát triển Delphi khác nên xem xét điều này, bởi vì một lần tăng tốc 3 lần cuối cùng có thể có lợi cho tất cả mọi người. Cá nhân tôi sẽ sớm sử dụng những gì được xây dựng trong ngôn ngữ hơn là một gói bên thứ 3 (thậm chí là một gói tốt như Gabr) nếu được lựa chọn. Nhưng bây giờ, tôi sẽ dính vào GPStringHash.
Đây là lần theo dõi: Đầu năm nay (2016), tôi đã nâng cấp lên Delphi XE8. Tôi đã nghĩ rằng TDictionary trong gói Delphi Generics có thể đã được cải thiện kể từ khi tôi hỏi câu hỏi này 5 năm trước đây. Vì vậy, tôi đã lấy GPStringHash bởi @gabr và thay thế bằng TDictionary. Sự chậm lại cho chương trình của tôi là khá đáng kể. Vì vậy, ít nhất là cho tương lai gần, tôi gắn bó với GPStringHash. – lkessler
Tùy thuộc vào nhu cầu của bạn, thay vì duy trì dữ liệu trong từ điển và thỉnh thoảng phân loại dữ liệu, bạn có thể làm ngược lại: duy trì dữ liệu trong danh sách được sắp xếp, nhưng sử dụng từ điển để truy cập nhanh 'ngẫu nhiên'. Điều này phù hợp hơn nếu bạn đang lưu/lấy thông qua SQL, ví dụ. Chỉ cần luôn luôn rõ ràng ai sở hữu đối tượng (dây, bạn an toàn). –