TStringList vs TList


¿Cuál es la diferencia en el uso de un estándar

type 
  sl: TStringList 

Comparado con el uso de un TList genérico

type 
  sl: TList<string>

?

Por lo que puedo ver, ambos se comportan exactamente igual.

¿Es solo otra forma de hacer lo mismo?

¿Hay situaciones en las que uno sería mejor que el otro?

Gracias!

Author: menjaraz, 2008-11-11

8 answers

  • TStringList es un descendiente de TStrings.
  • TStringList sabe cómo ordenarse alfabéticamente.
  • TStringList tiene una propiedad Objects.
  • TStringList no hace que su código sea incompatible con todas las versiones anteriores de Delphi.
  • TStringList se puede utilizar como una propiedad publicada. (Un error impide que las clases genéricas se publiquen, por ahora.)
 42
Author: Rob Kennedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 22:58:02

TStringList ha existido durante mucho tiempo en Delphi antes de que existieran los genéricos. Por lo tanto, ha construido un puñado de características útiles que una lista genérica de cadenas no tendría.

La versión genérica simplemente está creando un nuevo tipo que es idéntico a TList que funciona en el tipo de cadena. (.Añadir(), .Insertar(), .Quitar(), .Clear (), etc.)

TStringList tiene los métodos básicos de tipo TList y otros métodos personalizados para trabajar con cadenas, como .SaveToFile() y .LoadFromFile ()

Si desea compatibilidad con versiones anteriores, entonces TStringList es definitivamente el camino a seguir.
Si desea una funcionalidad mejorada para trabajar con una lista de cadenas, entonces TStringList es el camino a seguir. Si tiene algunos fundamentos básicos de codificación que desea trabajar con una lista de cualquier tipo, entonces tal vez necesite apartar la vista de TStringList.

 12
Author: Darian Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 01:54:10
  • Como TStringList es un descendiente de TStrings, es compatible con la propiedad Lines de TMemo, Elementos de TListBox y TComboBox y otros componentes VCL. Así que puede utilizar cbList.Items: = StringList; / / internamente llama a TStrings.Asignar
 2
Author: Gerry Coll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 01:11:05

Probablemente diría que si desea compatibilidad hacia atrás use TStringList, y si desea compatibilidad hacia adelante (tal vez la opción de cambiar esa lista de cadenas para decir lista de Int64s en el futuro), vaya a TList.

 2
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 08:34:03

Desde el punto de vista de la memoria, el uso de memoria de TStringList aumenta con el tamaño del puntero TObject agregado a cada elemento. El uso de memoria TList aumenta con el tamaño del puntero añadido a cada elemento. Si solo se necesita una matriz de cadenas sin buscar, reemplazar, ordenar u operaciones asociativas, una matriz dinámica (matriz de cadenas) debería ser suficiente. Esto carece de una buena gestión de memoria de TStringList o TList, pero en teoría debería usar menos memoria.

 2
Author: dzv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-17 13:40:54

La TStringList es una clase muy versátil de Delphi. He usado (y abusado ;-) ) su propiedad Objetos muchas veces. Es muy interesante traducir rápidamente una cadena delimitada a un control como un TMemo y otros similares (TListBox, TComboBox, solo para enumerar algunos).

Simplemente no me gusta mucho TList, ya que TStringList satisfizo mis necesidades sin necesidad de tratar punteros (ya que Tlist es una lista de valores de Puntero).

EDITAR: Confundí el TList (lista de punteros) con TList (lista genérica de cadenas). Lo siento por eso. Mi punto es: TStringList es mucho más que una simple lista de cadenas.

 2
Author: Fabricio Araujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-10 17:45:51

Para la mayoría de los propósitos que TStringList ha sido abusado en el pasado, TObjectDictionary es mejor - es más rápido y no necesita clasificación.

Si necesita un objeto TStrings (generalmente para cosas de interfaz de usuario, ya que la VCL no usa genéricos mucho incluso para XE5) use TStringList - el casting requerido de TObject es molesto pero no un showstopper.

 1
Author: Tony Hoyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 11:16:53

TStringList se ha utilizado durante demasiado tiempo y tiene muchas ventajas, todas mencionadas por Rob Kennedy.

La única desventaja real de usarlo como un par de una cadena y un objeto es la necesidad de convertir el objeto al tipo real esperado y almacenado en esta lista (al leer) y que yo sepa Embarcadero no proporcionó las bibliotecas Delphi 2009 y up VCL con la versión genérica de TStringList.

Para superar esta limitación implementé dicha lista para uso interno y durante casi 3 años sirve a su propósito, así que decidí compartirlo hoy: https://github.com/t00/deltoo#tgenericstringlist

Una nota importante: cambia la propiedad predeterminada de Cadenas a Objetos, ya que en la mayoría de los casos cuando el objeto se almacena en una lista, también es la propiedad a la que se accede principalmente.

 0
Author: too,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-25 11:00:42