如何获取类型集的任何变量的元素数量?

时间:2015-12-23 19:02:26

标签: delphi set delphi-xe delphi-xe5

AFAIK没有内置功能。在网上搜索我发现这个function它对我有用,但我不喜欢使用它,因为它是汇编而我无法理解它在做什么。所以我写了这个函数也有效:

function Cardinality(const PSet: PByteArray;
  const SizeOfSet(*in bytes*): Integer): Integer;
const
  Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
  I, J: Integer;
begin
  Result := 0;
  for I := 0 to SizeOfSet - 1 do
    for J := 0 to 7 do
      if (PSet^[I] and Masks[J]) > 0 then
        Inc(Result);
end;

现在,我想知道我是否可以依赖这个功能?或者也许设置数据类型背后有一个技巧,这就是delphi没有内置方法的原因。

if我的功能是可靠的then如何才能将其改进为:

  1. 将常量传递给它
  2. 进行类型检查并确保将一组传递给函数
  3. 传递值而不是其地址
  4. 摆脱SizeOfSet参数
  5. 我想将其称为Cardinality(AnySet),而不是Cardinality(@AnySet, SizeOf(TAnySet))

    顺便说一句,我需要在XE和XE5中编译它。

2 个答案:

答案 0 :(得分:5)

您可以使用泛型和RTTI实现此功能。像这样:

Writeln(TSet<SomeSet>.Cardinality(Value));

<强>用法:

<script>

答案 1 :(得分:2)

在早期版本的Delphi中,您可以这样做:

function Card(ASet: TSet): Integer;
var
  k: TSetElement;
begin
  Result := 0;
  for k in ASet do Inc(Result);
end;