Xác định " đúng ".
i18n sắp xếp hoàn toàn tùy thuộc vào ngôn ngữ của bạn.
Vì vậy, tôi hoàn toàn đồng ý với PA rằng đây không phải là lỗi: mặc định Sắp xếp hành vi hoạt động như được thiết kế để cho phép i18n hoạt động bình thường.
Giống như Gerry đề cập, TStringList.Sort sử dụng AnsiCompareStr và AnsiCompareText (tôi sẽ giải thích trong một vài dòng như thế nào nó đó).
Nhưng: TStringList là linh hoạt, nó có chứa Sắp xếp, CustomSort và CompareStrings, mà tất cả đều là ảo (để bạn có thể ghi đè lên chúng trong một lớp hậu duệ)
Hơn nữa, khi bạn gọi CustomSort, bạn có thể cắm vào chức năng của riêng bạn So sánh chức năng.
Tại các câu trả lời này là một Hãy so sánh chức năng mà những gì bạn muốn:
- Trường hợp nhạy cảm
- Không sử dụng bất kỳ locale
- Chỉ cần so sánh giá trị thứ tự của các nhân vật trong những chuỗi
CustomSort được định nghĩa là:
procedure TStringList.CustomSort(Compare: TStringListSortCompare);
begin
if not Sorted and (FCount > 1) then
begin
Changing;
QuickSort(0, FCount - 1, Compare);
Changed;
end;
end;
Theo mặc định, Sắp xếp phương pháp có một thực hiện rất đơn giản, đi qua một mặc định Hãy so sánh chức năng gọi StringListCompareStrings:
procedure TStringList.Sort;
begin
CustomSort(StringListCompareStrings);
end;
Vì vậy, nếu bạn định nghĩa của riêng bạn TStringListSortCompare tương thích So sánh phương pháp, sau đó bạn có thể xác định phân loại của riêng mình.
TStringListSortCompare được định nghĩa là một chức năng toàn cầu lấy TStringList và hai chỉ số tham khảo các mục mà bạn muốn so sánh:
type
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
Bạn có thể sử dụng StringListCompareStrings như một kim chỉ nam cho việc thực hiện của riêng bạn:
function StringListCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := List.CompareStrings(List.FList^[Index1].FString,
List.FList^[Index2].FString);
end;
Vì vậy, theo mặc định, TStringList.Sort sẽ chuyển sang TList.CompareStrings:
function TStringList.CompareStrings(const S1, S2: string): Integer;
begin
if CaseSensitive then
Result := AnsiCompareStr(S1, S2)
else
Result := AnsiCompareText(S1, S2);
end;
nào sau đó sử dụng dưới nói dối của Windows hàm API CompareString với người dùng miền địa phương mặc định 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;
Cuối cùng Hãy so sánh chức năng mà bạn cần. Một lần nữa những hạn chế:
- Trường hợp nhạy cảm
- Không sử dụng bất kỳ locale
- Chỉ cần so sánh giá trị thứ tự của các nhân vật trong những chuỗi
này được mã:
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;
Delphi không bị đóng, hoàn toàn ngược lại: thường nó là một kiến trúc thực sự linh hoạt.
Nó thường chỉ là một chút đào để xem nơi bạn có thể móc vào sự linh hoạt đó.
--jeroen
Windows cũng sắp xếp '_' trước' A' để TStringlist ít nhất là bao gồm hệ điều hành. –
nhận được kết quả mà bạn không mong đợi, không có nghĩa đó là lỗi. Nó không phải là một lỗi, nó được thiết kế theo cách này để hỗ trợ chính xác của người dùng (hoặc của hệ điều hành thay mặt cho người dùng) lựa chọn thứ tự sắp xếp. –
Bạn đang viết câu hỏi này với giả định rằng có * là * một cách chính xác để sắp xếp các ký tự không phải là chữ cái. Các từ gạch dưới xuất hiện ở đâu trong từ điển của bạn? –