TStringlist.sort 的CaseSensitive 是true或false,都是大小写不敏感。

披着虎皮的石头 2013-07-30 04:28:37

procedure TForm1.Button1Click(Sender: TObject);
var St :TStringList;
begin
St :=TStringList.Create;
{Ascii编码:
c 99
C 67
W 87
AWSAccessKeyId 和Action,
大小写不敏感,是Action前面,
大小写敏感, 是AWSAccessKeyId前面。}

St.Add('AWSAccessKeyId');
St.Add('Action');

St.CaseSensitive :=True; //true或false,比较结果,都是大小写不敏感,是否delphi的bug。
//St.Sorted :=false;
St.Sort;


if 'AWSAccessKeyId' >'Action' then
ShowMessage('AWSAccessKeyId 大')
else ShowMessage('Action 大');


ShowMessage(St.Strings[0] +' ' +St.Strings[1]);

//显示为Action AWSAccessKeyId,说明大小写不敏感的。
//而我要的是大小写敏感的。
end;
...全文
322 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 s11ss 的回复:
解决办法是自己从TStringList派生一个类,并覆盖CompareStrings方法(把AnsiCompareStr换成 [/code]
一语中的,就是按照这么做,区分大小写了。
林石公 2013-07-30
  • 打赏
  • 举报
回复
Delphi7在这一点上有点妖,如果用了CaseSensitive,它转而调用了AnsiCompareStr function TStringList.CompareStrings(const S1, S2: string): Integer; begin if CaseSensitive then Result := AnsiCompareStr(S1, S2) else Result := AnsiCompareText(S1, S2); end; 如果你看一下AnsiCompareStr的帮助 Note: Most locales consider lowercase characters to be less than the corresponding uppercase characters. This is in contrast to ASCII order, in which lowercase characters are greater than uppercase characters. Thus, setting S1 to 'a' and S2 to 'A' causees AnsiCompareStr to return a value less than zero, while CompareStr, with the same arguments, returns a value greater than zero. 它说了:因为很多淫认为大写的就是大,小写的就是小,拉个ascii与一般淫的常识不一致,所以如果你要求排序时区分大小写的话,俺就把小写的a淫为比大写的A小,所以blabla.....
ksjxqy 2013-07-30
  • 打赏
  • 举报
回复
字符串比较依赖于windows api:CompareStringA/CompareStringW。这个API的所有逻辑我测试了很多次,没有测试出来。但是可以肯定的是,大写字母是大于小写字母的。
s11ss 2013-07-30
  • 打赏
  • 举报
回复
看Sort的帮助: Sort uses AnsiCompareStr to sort the strings when CaseSensitive is true and AnsiCompareText when CaseSensitive is false. AnsiCompareStr的帮助: Most locales consider lowercase characters to be less than the corresponding uppercase characters. This is in contrast to ASCII order, in which lowercase characters are greater than uppercase characters. Thus, setting S1 to 'a' and S2 to 'A' causees AnsiCompareStr to return a value less than zero, while CompareStr, with the same arguments, returns a value greater than zero. 解决办法是自己从TStringList派生一个类,并覆盖CompareStrings方法(把AnsiCompareStr换成CompareString):
type
  TMyStringList = class(TStringList)
  protected
    function CompareStrings(const S1, S2: string): Integer; override;
  end;

{ TMyStringList }

function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
  if CaseSensitive then
    Result := CompareStr(S1, S2)
  else
    Result := CompareText(S1, S2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var St :TStringList;
begin
   St :=TMyStringList.Create;


   St.Add('AWSAccessKeyId');
   St.Add('Action');
   st.CaseSensitive := True;
   St.Sort;

    showmessage(st.Text);
    st.free;
end;
  • 打赏
  • 举报
回复
最近用delphi开发和各个网站的api接口。 越来越明白delphi工具,是一个核心类库设计较好, 语言自带外围类功能较弱,种类不是很全的。 用C#,是核心设计好,外围类功能强,种类全面。
sololie 2013-07-30
  • 打赏
  • 举报
回复
tstringlist.sort 是个虚函数,可以自己重写实现自己想要的排序方式,具体看tstringlist的源码

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧