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
如何才能将其改进为:
SizeOfSet
参数我想将其称为Cardinality(AnySet)
,而不是Cardinality(@AnySet, SizeOf(TAnySet))
。
顺便说一句,我需要在XE和XE5中编译它。
答案 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;