Alex2013 писал(а):Зачем такие извраты ? Обычный TStringList делает тоже самое только проще и совместимее(А возможно и быстрее ).
Как вариант - да, можно и так, но если полей по которым искать несколько, то по каждому надо делать свой TStringList.
Но тут я согласен с 
iskander писал(а):добавление элементов в сортированный TStringList имеет квадратичную сложность
добавит 100тыс строк в StringList - долгая пестня 

Скорее всего этот вариант 
iskander писал(а):Для уникальных ключей всё достаточно просто, используем хешмэп из Generics.Collections(полагаю, айдишки тоже должны быть уникальны), данные хранятся в отдельном массиве, поскольку создаётся два индекса:
будет быстрее, если он при добавлении элементов не создает копии строк, а добавляет ссылку.
Т.е. вот тут в строке NikMap.Add(Data[I].nikname, @Data[I]);  первый аргумент будет добавлен ссылкой на строку или будет создаваться её копия?
- Код: Выделить всё
-   for I := 0 to High(Data) do begin
 IdMap.Add(Data[I].id, @Data[I]);      // бросит исключение, если такой ключ уже существует
 NikMap.Add(Data[I].nikname, @Data[I]);
 end;