Delphi XE2:如何使用具有序数值的整数集>255 [英] Delphi XE2: How to use sets of integers with ordinal values > 255

查看:18
本文介绍了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:如何使用具有序数值的整数集&gt;255的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆