परिभाषित करने के लिए " सही ढंग से "।
i18n सॉर्टिंग पूरी तरह से आपके लोकेल पर निर्भर करता है।
तो मैं पूरी तरह से PA से सहमत हूं कि यह एक बग नहीं है: डिफ़ॉल्ट सॉर्ट करें व्यवहार कार्य करता है जो i18n को ठीक से काम करने की अनुमति देने के लिए डिज़ाइन किया गया है।
तरह Gerry का उल्लेख है, TStringList.Sort का उपयोग करता AnsiCompareStr और AnsiCompareText (मैं कुछ पंक्तियां यह कैसे करता है में यह बताएँगे)।
लेकिन: TStringList लचीला है, यह क्रमबद्ध, CustomSort और CompareStrings है, जो सभी आभासी हैं इसके अलावा (ताकि आप उन्हें एक वंशज कक्षा में ओवरराइड कर सकते हैं)
होता है, जब आप CustomSort कहते हैं, आप अपने में प्लग कर सकते हैं फ़ंक्शन की तुलना करें।
इस उत्तर के कम से एक समारोह की तुलना करता है कि आप क्या चाहते है:
- केस संवेदनशील
नहीं
- किसी भी स्थान का उपयोग कर
- बस तार के पात्रों में से क्रमसूचक मूल्य की तुलना
CustomSort इस रूप में परिभाषित किया गया है:
procedure TStringList.CustomSort(Compare: TStringListSortCompare);
begin
if not Sorted and (FCount > 1) then
begin
Changing;
QuickSort(0, FCount - 1, Compare);
Changed;
end;
end;
डिफ़ॉल्ट रूप से, क्रमबद्ध विधि एक बहुत ही सरल कार्यान्वयन है, एक डिफ़ॉल्ट समारोह कहा जाता StringListCompareStrings तुलना गुजर:
procedure TStringList.Sort;
begin
CustomSort(StringListCompareStrings);
end;
तो, अगर आप अपने खुद के TStringListSortCompare को परिभाषित संगत विधि की तुलना करें, तो आप अपनी खुद की सॉर्टिंग को परिभाषित कर सकते हैं।
type
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
आप StringListCompareStrings एक दिशानिर्देश के रूप में अपने को लागू करने के लिए उपयोग कर सकते हैं:
function StringListCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := List.CompareStrings(List.FList^[Index1].FString,
List.FList^[Index2].FString);
end;
TStringListSortCompare एक वैश्विक समारोह आइटम आप तुलना करना चाहते चर्चा करते हुए TStringList और इंडेक्स लेने के रूप में परिभाषित किया गया है
तो, डिफ़ॉल्ट रूप से TStringList.Sort TList.CompareStrings को defers:
function TStringList.CompareStrings(const S1, S2: string): Integer;
begin
if CaseSensitive then
Result := AnsiCompareStr(S1, S2)
else
Result := AnsiCompareText(S1, S2);
end;
कौन सा तो नीचे झूठ बोल रही है Windows API समारोह CompareString डिफ़ॉल्ट उपयोगकर्ता का स्थान LOCALE_USER_DEFAULT साथ उपयोग करें:
function AnsiCompareStr(const S1, S2: string): Integer;
begin
Result := CompareString(LOCALE_USER_DEFAULT, 0, PChar(S1), Length(S1),
PChar(S2), Length(S2)) - 2;
end;
function AnsiCompareText(const S1, S2: string): Integer;
begin
Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
Length(S1), PChar(S2), Length(S2)) - 2;
end;
अंत में समारोह आप की जरूरत की तुलना करें। फिर सीमाएं:
- केस संवेदनशील
- किसी भी स्थान का उपयोग नहीं
- बस तार
के पात्रों की क्रमसूचक मूल्य की तुलना इस कोड है:
function StringListCompareStringsByOrdinalCharacterValue(List: TStringList; Index1, Index2: Integer): Integer;
var
First: string;
Second: string;
begin
First := List[Index1];
Second := List[Index2];
if List.CaseSensitive then
Result := CompareStr(First, Second)
else
Result := CompareText(First, Second);
end;
डेल्फी बंद नहीं है, काफी विपरीत: अक्सर यह वास्तव में एक लचीला वास्तुकला है।
अक्सर यह देखने के लिए खुदाई होती है कि आप उस लचीलेपन में कहां लगा सकते हैं।
E1 E1 e2 E2
सही क्रम है (उदाहरण के लिए: क्योंकि यह वर्ण punctation साथ बराबर के रूप में हो जाता है
--jeroen
विंडोज 'ए' से पहले' _' भी टाइप करता है, इसलिए टीस्ट्रिंगलिस्ट कम से कम ओएस के साथ मिलती है। –
परिणाम प्राप्त करने की उम्मीद नहीं है, इसका मतलब यह नहीं है कि यह एक बग है। यह एक बग नहीं है, इसे क्रमबद्ध करने के क्रम में उपयोगकर्ता के (या ओएस की उपयोगकर्ता की तरफ से) का सही ढंग से समर्थन करने के लिए इस तरह से डिज़ाइन किया गया है। –
आप इस प्रश्न को इस धारणा के साथ लिख रहे हैं कि * * * nonalphabetic वर्णों को क्रमबद्ध करने का एक सही तरीका है। अंडरस्कोर शब्द आपके शब्दकोश में कहां दिखाई देते हैं? –