Dieses Verhalten kann nicht geändert werden. Sie können die Funktionsweise dieser Split-Funktion nicht anpassen. Ich vermute, dass Sie Ihre eigene Split-Implementierung bereitstellen müssen. Michael Erikkson weist in einem Kommentar darauf hin, dass sich System.StrUtils.SplitString
in der von Ihnen gewünschten Weise verhält.
Das Design scheint mir arm zu sein. Zum Beispiel
Length('a;'.Split([';'])) = 1
und noch
Length(';a'.Split([';'])) = 2
Diese Asymmetrie ist ein deutliches Zeichen für schlechtes Design. Es ist erstaunlich, dass Tests dies nicht identifizierten.
Die Tatsache, dass das Design so eindeutig verdächtig ist, bedeutet, dass es sich lohnt, einen Fehlerbericht einzureichen. Ich würde erwarten, dass es abgelehnt wird, da jede Änderung den bestehenden Code beeinflussen würde. Aber du weißt nie.
Meine Empfehlungen:
- Ihre eigene geteilte Implementierung verwenden, die, wie Sie führt erfordern.
- Reichen Sie einen Fehlerbericht ein.
Während System.StrUtils.SplitString
tut, was Sie wollen, seine Leistung nicht groß ist. Das ist sehr wahrscheinlich egal. In diesem Fall sollten Sie es verwenden. Wenn jedoch Leistung zählt, dann biete ich dies:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Diagnostics, System.StrUtils;
function MySplit(const s: string; Separator: char): TArray<string>;
var
i, ItemIndex: Integer;
len: Integer;
SeparatorCount: Integer;
Start: Integer;
begin
len := Length(s);
if len=0 then begin
Result := nil;
exit;
end;
SeparatorCount := 0;
for i := 1 to len do begin
if s[i]=Separator then begin
inc(SeparatorCount);
end;
end;
SetLength(Result, SeparatorCount+1);
ItemIndex := 0;
Start := 1;
for i := 1 to len do begin
if s[i]=Separator then begin
Result[ItemIndex] := Copy(s, Start, i-Start);
inc(ItemIndex);
Start := i+1;
end;
end;
Result[ItemIndex] := Copy(s, Start, len-Start+1);
end;
const
InputString = 'asdkjhasd,we1324,wqweqw,qweqlkjh,asdqwe,qweqwe,asdasdqw';
var
i: Integer;
Stopwatch: TStopwatch;
const
Count = 3000000;
begin
Stopwatch := TStopwatch.StartNew;
for i := 1 to Count do begin
InputString.Split([',']);
end;
Writeln('string.Split: ', Stopwatch.ElapsedMilliseconds);
Stopwatch := TStopwatch.StartNew;
for i := 1 to Count do begin
System.StrUtils.SplitString(InputString, ',');
end;
Writeln('StrUtils.SplitString: ', Stopwatch.ElapsedMilliseconds);
Stopwatch := TStopwatch.StartNew;
for i := 1 to Count do begin
MySplit(InputString, ',');
end;
Writeln('MySplit: ', Stopwatch.ElapsedMilliseconds);
end.
Der Ausgang eines 32 Bit-Version mit XE7 auf meinem E5530 bauen ist:
string.Split: 2798
StrUtils.SplitString: 7167
MySplit: 1428
So wurde es entworfen. Wenn Sie es nicht mögen, schreiben Sie Ihre eigene Split-Funktion. –
OK, danke David. –
Was passiert mit '; x'? Erhalten Sie einen Wert oder zwei? Wenn Sie zwei bekommen, dann ist das Design asymmetrisch, eine schlechte Sache. –