Delphi XE2:如何使用具有序数值的整数集>;255 [英] Delphi XE2: How to use sets of integers with ordinal values > 255
本文介绍了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
类型的变量。将有2个32=4294967296个不同的整数值,因此此变量必须具有4294967296位。因此,它的大小为512MB。这是一个巨大的变数。也许你可以在100年后把这样的价值放在堆栈上。
因此,如果您确实需要使用(数学)整数集,则需要自定义数据结构;内置的set
类型不起作用。例如,您可以将其实现为高级记录。然后,您甚至可以重载in
operator,使其看起来像真正的Pascal集合!
实现这样一个缓慢而低效的类型是微不足道的,这对于小集合来说可能已经足够好了。使用高效的操作(成员资格测试、子集测试、交集、并集等)实现通用整数集数据结构。是更多的工作。WWW上可能有可用的第三方代码(但StackOverflow不是库推荐的地方)。
如果您的需求比较一般,您可以使用一个简单的整数数组(TArray<Integer>
)。也许您不需要O(1)个成员资格测试、子集测试、交集和并集?
这篇关于Delphi XE2:如何使用具有序数值的整数集>;255的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文