德尔福 XE2 : How to use sets of integers with ordinal values > 255

标签 delphi set limit ordinal

我想要做的就是定义一组可能具有大于 255 的值的整数,但我没有看到任何好的选择。例如:with MyObject do Visible := Tag in [100, 155, 200..225, 240]; // Works just finewith 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 年内把这样的值(value)放在堆栈上。
因此,如果您确实需要处理(数学)整数集,则需要自定义数据结构;内置set类型不行。例如,您可以将其实现为高级记录。然后你甚至可以重载 in operator让它看起来像一个真正的帕斯卡集!
实现这样一个缓慢而低效的类型是微不足道的,这对于小集合来说可能已经足够了。实现具有高效操作(成员测试、子集测试、交集、并集等)的通用整数集数据结构需要更多的工作。 WWW 上可能有第三方代码可用(但 StackOverflow 不是库推荐的地方)。
如果您的需求不大,您可以使用一个简单的整数数组( TArray<Integer> )。也许您不需要 O(1) 成员资格测试、子集测试、交集和联合?

关于德尔福 XE2 : How to use sets of integers with ordinal values > 255,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66016949/

相关文章:

java - Set 如何确定其值的顺序?

java - addAll() 奇怪地更新了 HashMap

Mysql select 查询次数直到达到条件

mysql - 通过变量和声明变量时的错误设置结果限制

xml - 为什么 IXMLNode.IsTextElement 不为 CDATA 元素返回 True?

delphi - 我可以使用一个命令从一个特定字段获取所有记录吗?

arrays - 如何在Delphi中使用变体数组

Python设置交集问题

php - SQL 语句不会限制。显示没有结果

delphi - 通过 TXMLDocument 访问 IXMLDOMDocument2?