Tôi có một thuật toán tính toán trong Delphi với một số tùy chọn khác nhau và tôi cần thử mọi kết hợp các tùy chọn để tìm ra giải pháp tối ưu.Liệt kê các giá trị có thể đặt trong Delphi
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
Tôi băn khoăn về việc sử dụng một vòng lặp Integer để liệt kê chúng:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
này không biên dịch. Những gì tôi đã tự hỏi là nếu có bất kỳ phương pháp khá đơn giản để chuyển đổi từ Integer to Set (hầu hết các câu hỏi trên Web cố gắng đi theo cách khác, từ Set to Integer), và nếu như vậy nó là gì?
Một khả năng khác là chỉ cần sử dụng Integer như một chút-lĩnh vực:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
và sau đó kiểm tra thành viên với một Bitwise và:
if (Options and C_Option2) > 0 then begin
...
end;
Tôi đã cố gắng này, và nó hoạt động , nhưng nó cảm thấy như làm việc với các bộ sẽ tự nhiên hơn và sử dụng hệ thống kiểu tốt hơn (mặc dù tôi đang đi ra ngoài hệ thống kiểu đã nói để liệt kê các bộ).
Có cách nào tốt hơn/an toàn hơn để liệt kê tất cả các tổ hợp có thể đặt hơn là liệt kê biểu diễn số nguyên cơ bản không?
Ghi chú:
- Tôi biết rằng các giá trị số nguyên của một bộ không đảm bảo về mặt lý thuyết (mặc dù tôi nghi ngờ họ đang có trong thực tế nếu bạn không chơi với cách đánh số liệt kê).
- Có thể có nhiều hơn bốn tùy chọn (có, tôi biết rằng nó phát triển theo cấp số nhân và nếu có quá nhiều tùy chọn thuật toán có thể mất mãi mãi).
Điều đó thực sự làm việc. Tôi cho rằng nó sẽ không hoạt động đối với các bộ với hơn 8 thành viên? (mặc dù vào thời điểm đó thuật toán có lẽ đã quá chậm). –
Làm sizeof (SetVar) để tìm hiểu cách một tập hợp cụ thể được đại diện bởi Delphi. –