我在容器TObjectList中存放很多个TIMAGE对象,我在程序中只知道TIMAGE的Name,如何根据对象名Name定位它在容器中的位置,我要找到它修改他的一些属性。
只能用for循环比对确定位置吗?
for i := 0 to ObjectList.Count - 1 do
  begin
    if TIMAGE(ObjectList.Items[i]).Name = 'XX' 
    begin
      ..
    end;
  end;这样是不是会影响效率?
我要求比较迅速的完成这些操作,有没有其他方法?

解决方案 »

  1.   

    给你个范例参考
    procedure TForm1.Button1Click(Sender: TObject);
    var
      objectlist: TObjectList;
    begin
      objectlist := TObjectlist.Create;
      try
        objectlist.Add(self);
        Showmessage(TForm(objectlist.Items[objectlist.IndexOf(self)]).Name);
      finally
        objectlist.Free;
      end;
    end;
      

  2.   

    就用循环吧,其实objectlist.IndexOf之类的方法,实质也是循环的查找,找到后break,其实查找方法很多,数据结构中都有介绍,都可以用在这里,比如快速排序,具体的效率问题那就要看你的具体情况了,并不是高级的查找效率就一定高
      

  3.   

    看你有多大数据量了,如果最多上百条数据量,而且在程序中查询不是非常频繁,那用O(N)时间复杂度的查询对使用没什么影响;如果这里是瓶颈所在的话,那就应该考虑换一种数据结构了,比如hash table(更常用)或者binary search tree(rb-tree或者avl-tree)这两种数据结构比较适合处理类似情况btw,可以用TStringList来放,用TStringList.AddObject(string, TObject)/Strings[index]/Objects[index]存取TObject,查询的时候直接可以用名称了(Objects[IndexOf(Name)])。而且,如果数据几乎不需要insert/remove操作的话,可以用Sort排序,排序后的查询操作(IndexOf)就变成了二分法,时间复杂度由O(N)降为O(logN)
      

  4.   

    如果能用泛型的话就非常简单:(Delphi 2009)
    var
      list: TDictionary<string, TImage>;
      image: TImage;
    begin
      image := list['img1'];
      // or 
      if list.TryGetValue('img1', image) then
    end;
      

  5.   

    TDictionary<,>目前还是有bug的,clear之后就废了,而且enumerator的实现也有问题