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);