InterfacedLists.dpr 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. program InterfacedLists;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. System.SysUtils,
  6. Quick.Commons,
  7. Quick.Console,
  8. System.Generics.Collections,
  9. Quick.Collections,
  10. Quick.Linq;
  11. type
  12. TUser = class
  13. private
  14. fName : string;
  15. fAge : Integer;
  16. fRoles : TArray<string>;
  17. fRoles2 : IList<string>;
  18. public
  19. constructor Create(const aName : string; aAge : Integer; aRoles : TArray<string>);
  20. property Name : string read fName write fName;
  21. property Age : Integer read fAge write fAge;
  22. property Roles : TArray<string> read fRoles write fRoles;
  23. property Roles2 : IList<string> read fRoles2 write fRoles2;
  24. end;
  25. var
  26. List : IList<string>;
  27. ListObj : IObjectList<TUser>;
  28. myarray : TArray<string>;
  29. user : TUser;
  30. name : string;
  31. { TMyItem }
  32. constructor TUser.Create(const aName : string; aAge : Integer; aRoles : TArray<string>);
  33. begin
  34. fName := aName;
  35. fAge := aAge;
  36. fRoles := aRoles;
  37. fRoles2 := TXList<string>.Create;
  38. fRoles2.AddRange(aRoles);
  39. end;
  40. begin
  41. try
  42. ReportMemoryLeaksOnShutdown := True;
  43. //add values
  44. myarray := ['Joe','Mat','Lee'];
  45. //remove if starts with J
  46. myarray.Where('^J',True).Delete;
  47. //search for regex match
  48. cout('Search for regex match',ccYellow);
  49. for name in myarray.Where('e$',True).Select do
  50. begin
  51. cout('User %s ends with "e"',[name],etInfo);
  52. end;
  53. //add values to list
  54. List := TXList<string>.Create;
  55. List.Add('Joe');
  56. List.Add('Mat');
  57. List.Add('Lee');
  58. //get from index
  59. cout('User is %s',[List[2]],etInfo);
  60. //search for regex match
  61. cout('Search for regex match',ccYellow);
  62. for name in List.Where('^Ma',True).Select do
  63. begin
  64. cout('User %s starts with "Ma"',[name],etInfo);
  65. end;
  66. //add values to objectlist
  67. ListObj := TXObjectList<TUser>.Create;
  68. ListObj.Add(TUser.Create('Joe',22,['LocalAdmin']));
  69. ListObj.Add(TUser.Create('Mat',30,['SuperAdmin','DomainAdmin']));
  70. ListObj.Add(TUser.Create('Lee',40,['User']));
  71. //search for a object property
  72. cout('Search for a object property match with WhereClause',ccYellow);
  73. user := ListObj.Where('Name = ?',['Lee']).SelectFirst;
  74. if user <> nil then cout('%s is %d years old',[user.Name,user.Age],etInfo);
  75. //search with predicate
  76. cout('Search for a property match with Predicate',ccYellow);
  77. user := ListObj.Where(function(aUser : TUser) : Boolean
  78. begin
  79. Result := aUser.Name.StartsWith('J');
  80. end).SelectFirst;
  81. if user <> nil then cout('%s starts with J letter',[user.Name],etInfo);
  82. //search into a array property
  83. cout('Search into a array property',ccYellow);
  84. user := ListObj.Where('Roles2 CONTAINS ?',['SuperAdmin']).SelectFirst;
  85. if user <> nil then cout('%s is %s',[user.Name,CommaText(user.Roles)],etInfo);
  86. cout('List before remove Mat',ccYellow);
  87. for user in ListObj do
  88. begin
  89. cout('User "%s"',[user.Name],etInfo);
  90. end;
  91. ListObj.Where('Name = ?',['Mat']).Delete;
  92. cout('List after remove Mat',ccYellow);
  93. for user in ListObj do
  94. begin
  95. cout('User "%s"',[user.Name],etInfo);
  96. end;
  97. cout('Press ENTER to Exit',ccYellow);
  98. ConsoleWaitForEnterKey;
  99. except
  100. on E: Exception do
  101. Writeln(E.ClassName, ': ', E.Message);
  102. end;
  103. end.