Mir sind aber die Funktionen mit den Sets sehr wichtig.
Du willst es eh umbauen, oder?
Ähm Nö. Den Part lasse ich.
Übergibt doch dem Record einfach im Constructor eine Methodenzeiger der aus dem Set's bytes macht und entsprechend der Set-Größe dir die Arrays dynamisch erzeugt...
Oder ruf es direkt so auf
TccArray.Count[SetAtoByte(A1),SetBtoByte(B2)] := 7;
Das war Gedankenübertragung. ja. ich arbeite statt mit Sets einfach mit Arrays.
Die Klasse sieht jetzt so aus:
Delphi-Quellcode:
TccArray2D<TIndexX, TIndexY> = class
private
fCount: TDictionary<TPair<TIndexX, TIndexY>, Integer>;
fValue: TDictionary<TPair<TIndexX, TIndexY>, Double>;
function GetCount(aIndexX: TIndexX; aIndexY: TIndexY): Integer;
function GetValue(aIndexX: TIndexX; aIndexY: TIndexY): Double;
procedure SetCount(aIndexX: TIndexX; aIndexY: TIndexY; const Value: Integer);
procedure SetValue(aIndexX: TIndexX; aIndexY: TIndexY; const Value: Double);
Function IndexPair(aKey: TIndexX; aValue: TIndexY): TPair<TIndexX, TIndexY>;
public
constructor Create;
Destructor Destroy; override;
Property Count[aIndexX: TIndexX; aIndexY: TIndexY]: Integer read GetCount write SetCount;
Property Value[aIndexX: TIndexX; aIndexY: TIndexY]: Double read GetValue write SetValue;
Function Average(aIndexX: TIndexX; aIndexY: TIndexY): Double;
Function CountSum(aIndexX: array of TIndexX; aIndexY: array of TIndexY): Integer;
Function ValueSum(aIndexX: array of TIndexX; aIndexY: array of TIndexY): Double;
Procedure IncCount(aIndexX: TIndexX; aIndexY: TIndexY; aInc: Integer);
Procedure AddValue(aIndexX: TIndexX; aIndexY: TIndexY; aValue: Double);
end;
Darin sind zwei TDictionary, welche die Daten aufnehmen. Wer mir nicht so sicher, ob es performant genug ist.
Ein paar Pi-daumen-tests haben ergeben, 32000000 Werte zufügen benötigt ca. 5 Sekunden. Reicht für mich.
Das mit der Funktion, welches die Sets in ein Array wandeln ist ne gute Idee.
Auch kann ich die Klasse einfach erweitern. Einfach in der Ableitung eine Funktion mit den Sets definieren. Darin in Array Wandeln und an die vorhandene Array-Funktion übergeben
Delphi-Quellcode:
TMyArray = class(TccArray2D<TEnumA, TEnumB>)
private
public
Function CountSumFromSet(IndexA: TEnumASet; IndexB: TEnumBSet): Integer;
end;