Autor Téma: Úvaha - TList<string> vs. TStringList  (Přečteno 299 krát)

Offline František

  • Guru
  • *****
  • Příspěvků: 752
  • Karma: 7
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Úvaha - TList<string> vs. TStringList
« kdy: 14-07-2022, 16:03:17 »
aký je rozdiel v použití  TList<string> vs. TStringList
alebo kde použiť čo

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1389
  • Karma: 51
    • Verze Delphi: 10.3
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #1 kdy: 14-07-2022, 16:22:54 »
TStringList toho umí víc než ten generický (malá/velká písmena, oddělovač hodnot, AddObject apod.)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6691
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #2 kdy: 14-07-2022, 16:28:57 »
Excellent
Rated 1 time
Ja používam TList<string> len v tomto prípade
Kód: Delphi [Vybrat]
  1.   PTableData = ^TrTableData;
  2.   TrTableData = record
  3.     Booleans: TList<Boolean>;
  4.     Currencys: TList<Currency>;
  5.     Dates: TList<TDate>;
  6.     Integers: TList<Integer>;
  7.     Others: TList<Variant>;
  8.     Strings: TList<string>;
  9.   end;
Dôvod je zrejmý. Všetko obsluhujem rovnakým spôsobom.
Okrem toho mi TStringList poskytuje všetko čo potrebujem. Keďže to je základná trieda, tak nemá réžiu navyše ako každé generikum + nejaké obmedzenia.
+ čo napísal vandrovnik

Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #3 kdy: 14-07-2022, 16:31:06 »
TstringList je IMHO vyrazne optimalnejsi z hlediska pameti a dalsich, je to specialni vec. genericky je obecnejsi.
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 422
  • Karma: 0
    • Verze Delphi: 7
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #4 kdy: 16-07-2022, 17:27:58 »
Ja používam TList<string> len v tomto prípade
Kód: Delphi [Vybrat]
  1.   PTableData = ^TrTableData;
  2.   TrTableData = record
  3.     Booleans: TList<Boolean>;
  4.     Currencys: TList<Currency>;
  5.     Dates: TList<TDate>;
  6.     Integers: TList<Integer>;
  7.     Others: TList<Variant>;
  8.     Strings: TList<string>;
  9.   end;

Reaguji na Stanislav Hruška: Mohl byste sem prosím uvést příklad jak potom data z takové tabulky zapisujete do souboru? Výsledkem bude tedy binární soubor předpokládám? Chtěl bych vidět implementaci. Dík

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6691
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #5 kdy: 16-07-2022, 18:51:00 »
To si zle pochopil. Presnejšie, pomiešal so svojim problémom :)  Ten record je VirtulStringTree. Ja nikde nepoužívam zápis do súboru ;)  Okrem JSON. A na to mám SuperObject.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1182
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #6 kdy: 19-07-2022, 21:15:11 »
TstringList je IMHO vyrazne optimalnejsi z hlediska pameti a dalsich, je to specialni vec. genericky je obecnejsi.

Já nemám dostatek relevantních informací, ale myslíš, že to bude výrazně nebo alespoň znatelně v paměti lepší?
TStringList je na tom nesporně lépe, co se týče funkcí.

TList je ale jen nějaké pole stringů. TStringList je taky pole stringů, resp. ukazatel na pole, kde je navíc v paměti ukazatel na objekt.
Strukturou je to 100% stejné. TStringList má jen doprogramovanou funkčnost navíc. Jak jsou vnitřně udělána generika nevím.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #7 kdy: 20-07-2022, 09:26:03 »
TstringList je IMHO vyrazne optimalnejsi z hlediska pameti a dalsich, je to specialni vec. genericky je obecnejsi.

Já nemám dostatek relevantních informací, ale myslíš, že to bude výrazně nebo alespoň znatelně v paměti lepší?
TStringList je na tom nesporně lépe, co se týče funkcí.

TList je ale jen nějaké pole stringů. TStringList je taky pole stringů, resp. ukazatel na pole, kde je navíc v paměti ukazatel na objekt.
Strukturou je to 100% stejné. TStringList má jen doprogramovanou funkčnost navíc. Jak jsou vnitřně udělána generika nevím.

Představ si, že máš dvě deklarace TList<string> na ruznych místech. Linker nedokáže uplně spojit jejich implementace (tj. např. metody Add a spol.) a chápe je jako odlišné typy, což i v podstatě jsou. Pokud se nepletu, tak v posledních verzích se na tom hodně zapracovalo, a i když se jedná pořád o odlišné typy, jejich implementace jsou v podstatě inline a volají společné "helper" funkce, které jsou linkovány už jen jednou (na rozdíl od minulosti, kdy se kód hodně opakoval). Pokud si pamatuji tak, platí např. i pro TArray atd.  Takže velikost kódu významně poklesla (to je důvod proč v jedné z posledních verzí klesla velikost stejné aplikace velkem výrazně proti předchozí verzi).
IMHO se tomu dá ještě pomoci deklarací type TMujTypList = TList<MujTyp>, čím si zacháváme výhody generik a snížíme velikost kódu, protože linker to bude chápat jako jeden typ. Ale to ber bez záruky. Generika jsou částečně magie linkeru (stejně jako anonymní metody, tam je to přímo Avada Kedavra).

Pokud máš dvakrát TStringList, je to pořád TStringList. Jenže to je jen pro stringy.

Embarcadero MVP - Czech republic

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1182
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Úvaha - TList<string> vs. TStringList
« Odpověď #8 kdy: 20-07-2022, 18:45:29 »
Ano, to je jediná nevýhoda. Ale jak jsi zmínil, pomocí deklarace TMujStringList = TList<string> a TStringList to budou identické struktury, kde generika pouze nemají ty extra funkce.