यह व्यवहार बदला नहीं जा सकता है। यह स्प्लिट फ़ंक्शन कैसे काम करता है इसे अनुकूलित करने का कोई तरीका नहीं है। मुझे संदेह है कि आपको अपना खुद का विभाजन कार्यान्वयन प्रदान करने की आवश्यकता होगी। माइकल एरिकसन मददगार रूप से एक टिप्पणी में बताते हैं कि System.StrUtils.SplitString
आपकी इच्छानुसार व्यवहार करता है।
डिजाइन मुझे खराब लगता है। उदाहरण
Length('a;'.Split([';'])) = 1
और अभी तक
Length(';a'.Split([';'])) = 2
इस विषमता के लिए गरीब डिजाइन का एक स्पष्ट संकेत है। यह आश्चर्यजनक है कि परीक्षण ने इसकी पहचान नहीं की थी।
तथ्य यह है कि डिज़ाइन इतना स्पष्ट रूप से संदेह है कि यह एक बग रिपोर्ट सबमिट करने योग्य हो सकता है। मैं उम्मीद करता हूं कि यह किसी भी बदलाव से मौजूदा कोड को प्रभावित करेगा क्योंकि इससे इनकार किया जा सकता है। लेकिन आप कभी नहीं जान पाते।
मेरे सिफारिशें:
- अपने स्वयं के विभाजन कार्यान्वयन के रूप में आप की आवश्यकता करता है कि का उपयोग करें।
- एक बग रिपोर्ट सबमिट करें।
जबकि System.StrUtils.SplitString
आप क्या चाहते हैं करता है, इसके प्रदर्शन को महान नहीं है। इससे कोई फर्क नहीं पड़ता। इस मामले में आपको इसका इस्तेमाल करना चाहिए।
{$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.
एक 32 बिट रिहाई के उत्पादन में मेरी E5530 पर XE7 साथ निर्माण होता है:
string.Split: 2798
StrUtils.SplitString: 7167
MySplit: 1428
यह ठीक है कि यह कैसे डिजाइन किया गया था। यदि आपको यह पसंद नहीं है, तो अपना खुद का विभाजन कार्य लिखें। –
ठीक है, डेविड धन्यवाद। –
'x' के साथ क्या होता है? क्या आपको एक या दो मूल्य मिलते हैं? यदि आप दो प्राप्त करते हैं तो डिजाइन असमान है, एक बुरी चीज है। –