Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
Delphi 12 Athens
|
AW: Strings zusammenführen und Bereinigen
8. Mai 2023, 12:13
Ich hätte auch noch eine Alternative basierend auf einer gepimpten TStringList, die im Wesentlichen auf dem bisher gesagten aufbaut:
Delphi-Quellcode:
type
TNumberStringList = class(TStringList)
protected
function CompareStrings(const S1: string; const S2: string): Integer; override;
public
constructor Create;
procedure AddNumbers(const ACommaText: string);
end;
constructor TNumberStringList.Create;
begin
inherited Create(dupIgnore, True, True);
end;
procedure TNumberStringList.AddNumbers(const ACommaText: string);
begin
AddStrings(ACommaText.Split([',']));
end;
function TNumberStringList.CompareStrings(const S1, S2: string): Integer;
begin
Result := string.Compare(S1, S2, [TCompareOption.coDigitAsNumbers]);
end;
procedure TestNumberStringList;
var
String1: string;
String2: string;
String3: string;
begin
String1 := '1,2,4,6,9';
String2 := '1,3,6,9,10,11';
String3 := '2,3,4,9,10';
var lst := TNumberStringList.Create;
try
lst.AddNumbers(String1);
lst.AddNumbers(String2);
lst.AddNumbers(String3);
var S := lst.CommaText;
Assert(S = '1,2,3,4,6,9,10,11');
finally
lst.Free;
end;
end;
Zur Erklärung: - Mit dem dupIgnore, True
im Create werden erst gar eine Doubletten hinzugefügt (das zweite True für CaseSensitive ist hier redundant)
- Das coDigitAsNumbers
im CompareStrings sorgt für eine korrekte Sortierung der Zahlen
- Das AddNumbers vereinfacht das Hinzufügen der einzelnen Listen
Der obige Ansatz funktioniert auch wenn nicht nur Zahlen vorkommen. In dem Fall wäre der CaseSensitive Parameter im Create aber vielleicht doch relevant.
|
|
Zitat
|