Задача: Нужно получить строковый список уникальных значений.
Инструментарий: Delphi
Решение: Для решения данной задачи — можно воспользоваться классом TSringList
, в котором есть весь функционал необходимый для игнорирования дубликатов значений.
Для того чтобы при добавлении нового значения в список игнорировались дубликаты — он должен быть отсортирован и установлено свойство Duplicates = dupIgnore
. Рассмотрим пример:
var
UniqueList : TStringList;
begin
UniqueList := TStringList.Create;
UniqueList.Sorted := True;
UniqueList.Duplicates := dupIgnore;
...
UniqueList.Add();
...
FreeAndNil(UniqueList);
end;
Code language: Delphi (delphi)
Свойство Duplicates может принимать следующие значения:
Значение | Описание |
---|---|
dupIgnore | Игнорировать попытки добавить повторяющиеся строки в список. |
dupError | Вызвать исключение EStringListError, когда делается попытка добавления повторяющихся строки в список. |
dupAccept | Позволяет добавлять дубликаты в отсортированном списке. |
Также для проверки регистра строк можно использовать свойство CaseSensitive
Более подробно cо свойствами TStringList'а
можно ознакомится тут
UPD: 08.2016
только ппоробуй загрузить несколько десятков тысяч и ляжет Стринглист намертво.
Я написал тестовый пример, в котором добавлял 1млн. уникальных значений. Добавление заняло уйму времени, но все же все добавилось, и ясно почему, чем больше уникальных значений, тем дольше выполняется поиск. Если брать по производительности, тогда Dictionary<> выигрывает в разы, поскольку использует ключ в виде хеша. Так что все сводится к условию задачи и какой объем данным мы будем использовать. Если интересно — могу описать бенчмарк в виде статьи.
Олександр Андрощук не пишите ерунды, десятки тысяч и гайки стринглисту. даже на сотню тысяч записей , без разницы уникальных или нет. и стринглист не вытянет.
Roman Savenko приведите пожалуйста пример на каких данных у Вас не получилось загрузить даже тысячу записей в StringList.