TStringList против TList ‹string›

в чем разница в использовании стандарта

type 
  sl: TStringList 

по сравнению с использованием общего TList

type 
  sl: TList<string>

?

Насколько я понимаю, оба ведут себя одинаково.

Это просто еще один способ сделать то же самое?

Бывают ли ситуации, когда одно лучше другого?

Спасибо!


person Holgerwa    schedule 10.11.2008    source источник
comment
Попробуйте добавить к ним обоим «Hello» + sLineBreak + «World». Поведение не то же самое   -  person Sir Rufo    schedule 22.11.2012


Ответы (8)


  • TStringList является потомком TStrings.
  • TStringList умеет сортировать себя по алфавиту.
  • TStringList имеет свойство Objects.
  • TStringList не делает ваш код несовместимым со всеми предыдущими версиями Delphi.
  • TStringList можно использовать как опубликованное свойство. (На данный момент из-за ошибки не удается опубликовать общие классы.)
person Rob Kennedy    schedule 10.11.2008
comment
Тот факт, что TStringList является потомком TStrings, является важной особенностью: его можно использовать в VCL, где используется TStrings. Поэтому очень удобно использовать TStrings в вашем коде. - person Arnaud Bouchez; 17.10.2011
comment
Вы отвечаете на ответ, которому пять лет, @Bernd. Если вы хотите знать, могут ли опубликованные свойства иметь типы, являющиеся универсальными классами, я приглашаю вас сначала опробовать его, а во-вторых, опубликовать реальный вопрос об этом. Когда вы публикуете свой вопрос, ожидается, что вы сначала попробуете его, поэтому обязательно сообщите о своем опыте и укажите, какую версию вы используете. В 2008 году я явно не говорил ни о какой версии новее, чем Delphi 2009. - person Rob Kennedy; 19.10.2013
comment
Хороший аргумент! Я не включил свой мозг. Проклятие, не может быть другой версии, кроме 2009, потому что с той версией, в которой были введены дженерики, и никакая другая версия Delphi не была опубликована для отмеченных в то время. Но теперь у нас это задокументировано ;-) - person Bernd Ott; 21.10.2013

TStringList существует в Delphi задолго до того, как появились дженерики. Таким образом, он создал несколько полезных функций, которых не было бы в общем списке строк.

Версия generics просто создает новый тип, идентичный TList, который работает с типом String. (.Add (), .Insert (), .Remove (), .Clear () и т. Д.)

TStringList имеет базовые методы типа TList и другие методы, настраиваемые для работы со строками, такие как .SaveToFile () и .LoadFromFile ()

Если вам нужна обратная совместимость, то TStringList определенно вам подходит.
Если вам нужна расширенная функциональность для работы со списком строк, то TStringList - это то, что вам нужно. Если у вас есть некоторые базовые основы кодирования, которые вы хотите использовать со списком любого типа, то, возможно, вам нужно отвести взгляд от TStringList.

person Darian Miller    schedule 11.11.2008

Я бы, наверное, сказал, что если вам нужна обратная совместимость, используйте TStringList, а если вы хотите прямую совместимость (возможно, возможность изменить этот список строк, чтобы указать список Int64 в будущем), тогда перейдите к TList.

person Steve    schedule 11.11.2008

С точки зрения памяти использование памяти TStringList увеличивается с размером указателя TObject, добавляемого к каждому элементу. Использование памяти TList увеличивается с увеличением размера указателя, добавляемого к каждому элементу. Если нужен только массив строк без поиска, замены, сортировки или ассоциативных операций, достаточно динамического массива (массива строк). Здесь отсутствует хорошее управление памятью TStringList или TList, но теоретически следует использовать меньше памяти.

person dzv    schedule 17.10.2011

TStringlist - один из очень универсальных классов Delphi. Я использовал (и злоупотреблял ;-)) его свойство Objects много раз. Очень интересно быстро преобразовать строку с разделителями в такой элемент управления, как TMemo и подобные (TListBox, TComboBox, и это лишь некоторые из них).

Мне просто не нравится много TList, поскольку TStringList удовлетворяет мои потребности без необходимости обработки указателей (поскольку Tlist - это список значений указателя).

РЕДАКТИРОВАТЬ: я перепутал TList (список указателей) с TList (общий список строк). Простите за это. Моя точка зрения остается неизменной: TStringList - это намного больше, чем простой список строк.

person Fabricio Araujo    schedule 12.11.2008

Для большинства целей, которыми ранее злоупотребляли TStringList, лучше использовать TObjectDictionary - он быстрее и не требует сортировки.

Если вам нужен объект TStrings (как правило, для UI материала, поскольку VCL не очень много использует дженерики даже для XE5), используйте TStringList - требуемое приведение из TObject раздражает, но не мешает работе.

person Tony Hoyle    schedule 27.09.2013

TStringList используется слишком долго и имеет множество преимуществ, о которых говорил Роб Кеннеди.

Единственный реальный недостаток его использования как пары строки и объекта - это необходимость приведения объекта к фактическому типу, ожидаемому и хранящемуся в этом списке (при чтении), и, насколько мне известно, Embarcadero не предоставлял Delphi 2009 и выше. Библиотеки VCL с общей версией TStringList.

Чтобы преодолеть это ограничение, я реализовал такой список для внутреннего использования, и почти 3 года он служит своей цели, поэтому я решил поделиться им сегодня: https://github.com/t00/deltoo#tgenericstringlist

Одно важное замечание - он меняет свойство по умолчанию со строк на объекты, так как в большинстве случаев, когда объект хранится в списке, он также является его наиболее часто используемым свойством.

person too    schedule 25.07.2013

person    schedule
comment
но вы можете сделать cbList.Items.AddStrings (ListOfString.toArray) или что-то в этом роде. PS. Настоящий вопрос, чтобы понять, чем отличаются TList ‹string› и TArray ‹string› :-D - person Arioch 'The; 14.06.2012