Delphi XE2:如何使用带序数值的整数集>;255

Delphi XE2:如何使用带序数值的整数集>;255,delphi,set,limit,ordinal,Delphi,Set,Limit,Ordinal,我想做的就是定义一组值可能高于255的整数,但我没有看到任何好的选项。例如: 带MyObject do Visible:=标记在[100155200..225240];//工作正常 但是 带MyObject do Visible:=标记在[100201..212、314、820、7006];//编译器错误 我已经习惯了(通常是冗长的)条件语句,例如: MyObject do可见时:=(标记在[100202..212]中)或(标记=314)或(标记=820)或(标记=7006) 但这似乎很荒谬,这

我想做的就是定义一组值可能高于255的整数,但我没有看到任何好的选项。例如:

带MyObject do Visible:=标记在[100155200..225240];//工作正常

但是

带MyObject do Visible:=标记在[100201..212、314、820、7006];//编译器错误

我已经习惯了(通常是冗长的)条件语句,例如:

MyObject do可见时:=(标记在[100202..212]中)或(标记=314)或(标记=820)或(标记=7006)

但这似乎很荒谬,这只是一个硬编码的例子。如果我想编写一个过程并传递一组值可能大于255的整数,该怎么办?必须有一种更好、更简洁的方法来实现这一点。

的基类型必须是最多具有256个不同值的序数类型,这样的变量对于每个可能的值都有一位,因此
字节集类型的变量大小为256位=32字节

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

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

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


如果您的需求比较温和,可以使用简单的整数数组(
TArray
)。也许您不需要O(1)成员资格测试、子集测试、交集和联合?

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

或者使用一个通用列表,例如TList作为TList查看,它有一个通用的集合解决方案来解决这个问题。您可以在这里找到一个实现的通用集合:您认为通过查看控件的标记值是否在整数列表中来测试控件是否应该可见,从而增加数据库的开销是合适的吗?@KenWhite请查看这些标记值。我不知道作者是如何分配它们的,但看起来那里有很多数据。无论何时,当您有大量数据时,最好使用适当的DB引擎处理它。显示的最高标记号是7006,即使它是700006,它仍然是一个可以轻松存储在内存中的单个整数值列表。用于这个简单任务的数据库效率要低得多。我认为256值限制的唯一原因是如果他们使用位作为标志。非常快速和高效,但有限。我只是希望Delphi能够在任意数据集上使用集合操作。在引擎盖下,它可能会使用列表,这显然比在DWord上执行XOR慢得多,但如果有这种灵活性就好了。好的,我当然可以用几种opf方法来实现,但我只是想看看我是否忽略了一个我不知道的内置函数。谢谢你的帮助!