Thema: Delphi [Unit] Generische Sets

Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

[Unit] Generische Sets

  Alt 24. Feb 2015, 12:45
Delphi-Version: XE7
Hallo,

Nachdem ich den Blogeintrag Delphi Record Helpers For Sets gelesen habe wollte ich mich mal an etwas versuchen und ich denke es ist etwas brauchbares dabei herausgekommen.

Was das Set kann:
  • Alle Operatoren die auch bei nativen Sets unterstützt werden (+, -, *, in, =, <>, <=, >=)
  • Entsprechende Methoden zu diesen Operatoren (Include(), Exclude(), Intersect(), Contains(), Equals(), IsSubsetOf(), IsSuperSetOf())
  • Zusätzlich werden statt + und * auch or und and unterstützt
  • Symmetrische Differenz (SymDifference() oder xor)
  • Enumerator enthalten (funktioniert mit for-in)

Was das Set nicht kann:

Weil ich etwas schummeln musste sind konstante Set-Ausdrücke letztendlich konstante Arrays wodurch keine ".." unterstützt werden.
Allerdings haben alle relevanten Methoden eine Überladung in der Art (Include() als Beispiel):

function Include(ARangeFrom, ARangeTo: T): TSet<T>; overload;

Dadurch ist auch das Arbeiten mit Ranges größtenteils möglich. Sowas wie [a..f,z] ist allerdings auch nur über kleine Umwege möglich.

Beispiele:

Zitat:
BUT, how GREAT would it be to be able to do:
Delphi-Quellcode:
type
  TDay = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

var days : TSet<TDay>;
    b : boolean;
begin
  days := [Monday, Tuesday]
  b := days.Intersect([Monday, Thursday]).IsEmpty;
end;
Delphi-Quellcode:
var days1, days2 : TSet<TDay>;
begin
  days1 := TSet<TDay>.Create(Monday, Wednesday).Include(Sunday); // = [Monday..Wednesday,Sunday]
  days2 := [Tuesday, Thursday, Sunday];

  Caption := (days1 * days2).ToString(); // oder days1.Intersect(days2).ToString();
end;
Achtung: Da man den generischen Typ nicht auf "enum" (o.ä.) einschränken kann, muss man selbst aufpassen dass man den Typ nur mit Aufzählungstypen zusammen verwendet (alles andere macht auch nicht viel Sinn, aber es kompiliert halt und wird zur Laufzeit höchstwahrscheinlich entweder Fehler erzeugen oder zumindest nicht das tun was man erwartet!)

Achtung2: Das Ganze funktioniert wahrscheinlich nur für XE7+ !

Würde mich über Feedback freuen
Angehängte Dateien
Dateityp: pas GenericSet.pas (13,4 KB, 27x aufgerufen)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (24. Feb 2015 um 14:58 Uhr)
  Mit Zitat antworten Zitat