Generic Collections

List that can own (free) objects TDictionary<K, V> TObjectDictionary<K, V>

Dictionary owning keys and/or values ([doOwnsKeys, doOwnsValues]) TQueue<T> / TObjectQueue<T> TStack<T> / TObjectStack<T> THashSet<T> (11+) TSortedList<T> / TThreadList<T> Sorted / thread-safe list Producer/consumer queue with timeouts

Static helpers: Sort, BinarySearch, Copy TStringList, TObjectList (Contnrs), TList (pointers)

Spring4D collections (IList<T>, IDictionary<K,V>, LINQ-like Where/Select/OrderBy) are interface-based, auto-freed, and very popular.

uses System.Generics.Collections, System.Generics.Defaults;

// TList<T>
var Nums := TList<Integer>.Create;
try
  Nums.AddRange([5, 3, 8, 1]);
  Nums.Add(10);
  Nums.Insert(0, 99);
  Nums.Remove(3);
  Nums.Delete(0);
  Nums.Sort;
  Nums.Sort(TComparer<Integer>.Construct(function(const A, B: Integer): Integer begin Result := B - A; end));
  Writeln(Nums.Count, ' ', Nums.Contains(8), ' ', Nums.IndexOf(8), ' ', Nums.First, ' ', Nums.Last);
  for var N in Nums do Write(N, ' ');
  var Arr := Nums.ToArray;
finally
  Nums.Free;
end;

// TDictionary<K, V>
var Ages := TDictionary<string, Integer>.Create;
try
  Ages.Add('Ana', 30);              // raises if the key exists
  Ages.AddOrSetValue('Bo', 25);
  Ages['Cy'] := 40;
  var Age: Integer;
  if Ages.TryGetValue('Ana', Age) then Writeln(Age);
  Writeln(Ages.ContainsKey('Bo'));
  Ages.Remove('Bo');
  for var Pair in Ages do Writeln(Pair.Key, '=', Pair.Value);
  for var Key in Ages.Keys do Writeln(Key);
finally
  Ages.Free;
end;

// Case-insensitive dictionary
var CI := TDictionary<string, Integer>.Create(TIStringComparer.Ordinal);