如何解决Delphi XE2:如何使用序数值 > 255
我想要做的就是定义一组可能具有大于 255 的值的整数,但我没有看到任何好的选择。例如:
with MyObject do Visible := Tag in [100,155,200..225,240]; // Works just fine
但是
with MyObject do Visible := Tag in [100,201..212,314,820,7006]; // Compiler error
我已经习惯了(通常是冗长的)条件语句,例如:
with MyObject do Visible := (Tag in [100,202..212]) or (Tag = 314) or (Tag = 820) or (Tag = 7006);
但这似乎很荒谬,这只是一个硬编码的例子。如果我想编写一个过程并传递一组值可能大于 255 的整数怎么办?必须有一种更好、更简洁的方法来做到这一点。
解决方法
Delphi set 的基本类型必须是最多具有 256 个不同值的序数类型。 Under the hood,这样的变量对于每个可能的值都有一位,因此 set of Byte
类型的变量的大小为 256 位 = 32 字节。
假设可以创建一个 set of Integer
类型的变量。有 232 = 4294967296 个不同的整数值,所以这个变量必须有 4294967296 位。因此,它的大小为 512 MB。这是一个巨大的变量。也许你可以在 100 年内把这样的价值放在堆栈上。
因此,如果您确实需要处理(数学)整数集,则需要自定义数据结构;内置的集合类型不行。例如,您可以将其实现为高级记录。然后您甚至可以重载 in
运算符,使其看起来像一个真正的 Pascal 集!
实现一个缓慢且低效的类型是微不足道的,这对于小集合来说可能已经足够了。实现具有高效操作(成员测试、子集测试、交集、并集等)的通用整数集数据结构需要更多的工作。 WWW 上可能有第三方代码可用(但 Stack Overflow 不是库推荐的地方)。
如果您的需求不大,您可以使用简单的整数数组 (TArray<Integer>
)。也许你不需要 O(1) 成员测试、子集测试、交集和联合?
我想说,这样的任务已经需要一个数据库。像 TFDMemTable + TFDLocalSQL 这样的小而简单的东西应该可以做到。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。