如果对列表进行排序,为什么Delphi的TStringList.InsertObject()方法抛出异常?

Rob*_*ler 6 delphi exception sorted tstringlist sortedlist

在Delphi 6中,如果您尝试将对象插入到已排序的TStringList(Sorted = true),则会抛出异常,警告您在排序列表上不允许使用InsertObject().如果调用InsertObject()必然意味着破坏列表的Sorted顺序,我可以理解这一点.但鉴于TStringList.Find()方法:

function TStringList.Find(const S: string; var Index: Integer): Boolean;
Run Code Online (Sandbox Code Playgroud)

返回一个索引,告诉你如果给定字符串添加到列表中的插入索引应该是什么,使用该索引调用InsertObject()应该在操作后保持排序列表仍然按排序顺序.我已经检查了TStringList的Delphi源代码,它似乎证实了我的断言.

现在我只是为TStringList创建一个新的子类,它覆盖了InsertObject(),并且如果在排序列表中调用了InsertObject(),则不会抛出异常,但我想确保没有一些隐藏的危险我我只是没有看到.

- roschler

Rod*_*ddy 7

您应该只调用AddObject排序列表.

如果InsertObject检查排序列表上的"正确"索引,那么您将面临测试噩梦:在某些情况下,您的代码似乎可以正常工作,但如果输入数据发生更改,则会突然开始抛出异常.或者,如果InsertObject忽略Index参数,那么它的行为将非常不直观.

InsertObject如果列表已排序,总是抛出更好.