Delphi XE2:如何使用序数值大于 255 的整数集

Delphi XE2: How to use sets of integers with ordinal values > 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 must be an ordinal type with at most 256 distinct values. Under the hood 的基本类型,这样的变量对于每个可能的值都有一位,因此类型 set of Byte 的变量大小为 256 位 = 32 字节。

假设可以创建类型为 set of Integer 的变量。会有 232 = 4294967296 个不同的整数值,所以这个变量必须有 4294967296 位。因此,它的大小为 512 MB。这是一个巨大的变数。也许你可以在 100 年后将这样的值放在堆栈上。

因此,如果您确实需要使用(数学)整数集,则需要自定义数据结构;内置的 set 类型不会。例如,您可以将其实现为高级记录。然后你甚至可以重载 in operator 让它看起来像一个真正的 Pascal 集!

实现这样一个缓慢且低效的类型是微不足道的,这对于小集合来说可能已经足够好了。实现具有高效操作(成员测试、子集测试、交集、并集等)的通用整数集数据结构需要更多工作。 WWW 上可能有第三方代码可用(但 Whosebug 不是库推荐的地方)。

如果您的需求比较普通,您可以改用简单的整数数组 (TArray<Integer>)。也许您不需要 O(1) 的成员测试、子集测试、交集和联合?

我想说,这样的任务已经需要一个数据库。像 TFDMemTable + TFDLocalSQL 这样小而简单的东西应该可以。