IndexedList.dpr 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. program IndexedList;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. System.SysUtils,
  6. Quick.Commons,
  7. Quick.Console,
  8. Quick.Chrono,
  9. Quick.Lists;
  10. type
  11. TUser = class
  12. private
  13. fId : Int64;
  14. fName : string;
  15. fSurName : string;
  16. fAge : Integer;
  17. public
  18. property Id : Int64 read fId write fId;
  19. property Name : string read fName write fName;
  20. property SurName : string read fSurName write fSurName;
  21. property Age : Integer read fAge write fAge;
  22. end;
  23. const
  24. numusers = 100000;
  25. UserNames : array of string = ['Cliff','Alan','Anna','Phil','John','Michel','Jennifer','Peter','Brandon','Joe','Steve','Lorraine','Bill','Tom'];
  26. UserSurnames : array of string = ['Gordon','Summer','Huan','Paterson','Johnson','Michelson','Smith','Peterson','Miller','McCarney','Roller','Gonzalez','Thomson','Muller'];
  27. var
  28. users : TIndexedObjectList<TUser>;
  29. user : TUser;
  30. i : Integer;
  31. crono : TChronometer;
  32. begin
  33. try
  34. ReportMemoryLeaksOnShutdown := True;
  35. users := TIndexedObjectList<TUser>.Create(True);
  36. users.Indexes.Add('Name','fName');
  37. users.Indexes.Add('Surname','fSurname');
  38. users.Indexes.Add('id','fId');
  39. cout('Generating list...',etInfo);
  40. //generate first dummy entries
  41. for i := 1 to numusers - high(UserNames) do
  42. begin
  43. user := TUser.Create;
  44. user.Id := Random(999999999999999);
  45. user.Name := 'Name' + i.ToString;
  46. user.SurName := 'SurName' + i.ToString;
  47. user.Age := 18 + Random(20);
  48. users.Add(user);
  49. end;
  50. //generate real entries to search
  51. for i := 0 to high(UserNames) do
  52. begin
  53. user := TUser.Create;
  54. user.Id := Random(999999999999999);
  55. user.Name := UserNames[i];
  56. user.SurName := UserSurnames[i];
  57. user.Age := 18 + Random(20);
  58. users.Add(user);
  59. end;
  60. crono := TChronometer.Create(True);
  61. user := users.Get('Name','Peter');
  62. crono.Stop;
  63. if user <> nil then cout('Found by Index: %s %s in %s',[user.Name,user.SurName,crono.ElapsedTime],etSuccess)
  64. else cout('Not found!',etError);
  65. crono.Start;
  66. for i := 0 to users.Count - 1 do
  67. begin
  68. if users[i].Name = 'Peter' then
  69. begin
  70. crono.Stop;
  71. cout('Found by Iteration: %s %s at %d position in %s',[user.Name,user.SurName,i,crono.ElapsedTime],etSuccess);
  72. Break;
  73. end;
  74. end;
  75. cout('Press a key to Exit',etInfo);
  76. ConsoleWaitForEnterKey;
  77. users.Free;
  78. crono.Free;
  79. except
  80. on E: Exception do
  81. cout('%s : %s',[E.ClassName,E.Message],etError);
  82. end;
  83. end.