Eine Schleife ist wirklich der formal korrekte Weg, es zu tun.
type
TSetType = set of TEnumType;
function HighestMember(const s: TSetType): TEnumType;
begin
for Result := High(Result) downto Low(Result) do
if Result in s then
exit;
raise Exception.Create('empty sets have no highest member');
end;
Jede andere Art der Lösung wird Typ-Casting oder Assembler erfordern, die Sie beide Typsicherheit zu verlieren zwingen - sie gehen „außerhalb der Sprache“, sozusagen.
Wenn Sie garantieren können, dass Ihr Set nicht mehr als 32 mögliche Elemente enthält, kann das Set mit einer gewöhnlichen Ganzzahl überlagert werden und Ihre Frage entspricht der Position des höchsten in einem 32-Bit gesetzten Bits ganze Zahl. Das wurde hier vor gefragt, so ziemlich:
Wenn Sie nicht über eine 32-Element Beschränkung des Satztyp haben, dann haben Sie Delphi 256-Element Grenze, und jedes Bit Die Lösung zum Umgehen muss einen 32- Byte Eingang verarbeiten.
A 256-max-Zählschleife das höchste Bit gesetzt ist nicht brute Kraft zu finden. Ein Angriff auf das Verteidigungsministerium oder der Versuch, RSA zu entschlüsseln, ist brutal. Dies ist die beste Lösung. Schreiben Sie Ihren Code zuerst für die Lesbarkeit, dann für die Sekunde (und nur dann, wenn Sie einen echten Flaschenhals entdecken). – paxdiablo
Diese Art von basiert auf der internen Implementierung eines Satzes als ein Bitset, nicht wahr? Sonst würde ich es vorziehen, die Elemente der Menge zu durchlaufen, anstatt alle möglichen Werte zu durchlaufen. – jpfollenius
Smasher, es gibt keine Möglichkeit, den Inhalt einer Menge aufzumerken, außer dass alle möglichen Werte überprüft werden. Intern funktioniert so die "for-in" -Schleife. Die Methode, die ich mit Code demonstriert habe, beruht nicht auf irgendeiner internen Repräsentation, nur dass die Menge endlich ist.Jede Bit-Twiddling-Lösung beruht auf der internen Repräsentation, aber das ist eine sehr sichere Annahme: Delhi-Sets haben sich nie verändert; Sie sind die gleichen wie in Turbo Pascal. –