Domanda
ho questo problema: come posso aggiungere la lista di una lista? ho provato così, ma la lista principale di ritorno sempre una lista, e non capire dove mi sbaglio. La struttura è questo:
PCombArray = array of Integer;
PStatsRecord = record
Comb: PCombArray;
Freq: Integer;
end;
PStatsList = TList<PStatsRecord>;
TStatsList = TList<PStatsList>;
Dove Comb è un campo che lavoro come chiave primaria. Ma qui tutto ok. Definisco lista principale come:
var
MainList: TStatsList;
MySubList: PStatsList;
e creare, senza problemi. Un'opera procedura per compilare un elenco secondario; per esample io chiamo questa procedura come MakeSubList e assegnare un MySubList lista maked, poi lo aggiungo alla lista principale:
MainList := TList<PStatsList>.Create;
try
MainList.Clear;
for index := 1 to N do // generate N subList
begin
...
MySubList := MakeSubList(index); // contain correct sub list, no problem here
...
MainList.Add(MySubList); // add mysublist to mainlist
end;
writeln (mainList.count); // return 1, and not N-1 sublist
finally
MainList.Free;
end;
Grazie che mi aiutano a capire in modo che io possa risolverlo. Grazie ancora.
Soluzione
Il tuo make funzione elenco sub potrebbe essere sbagliato, o si potrebbe aver confuso da soli con i vostri convenzioni di denominazione che non seguono in alcun modo i / convenzioni di denominazione Pascal solito Delphi per i tipi.
I seguenti lavori di codice, però.
Si noti che un TList è un oggetto, quindi se si vuole fare una lista di TList assicurarsi di utilizzare TObjectList invece di TList pianura a meno che non vi piace perdite di memoria. La vostra lista interna è di circa un tipo di record e non ha bisogno di essere TObjectList, ma se è stato modificato StatsRecord a TStatsData come un tipo TObject (classe), si dovrebbe anche cambiare TObjectList.
unit aUnit5;
interface
uses Generics.Collections;
procedure Test;
implementation
type
CombArray = array of Integer;
StatsRecord = record
Comb: CombArray;
Freq: Integer;
end;
TStatsList2 = TList<StatsRecord>;
TStatsList = TObjectList<TStatsList2>;
var
MainList: TStatsList;
MySubList: TStatsList2;
index:Integer;
procedure Test;
begin
MainList := TStatsList.Create;
try
for index := 1 to 10 do // generate N subList
begin
MySubList := TStatsList2.Create;
MainList.Add(MySubList); // add mysublist to mainlist
end;
finally
MainList.Free;
end;
end;
end.
Altri suggerimenti
MainList
è una lista di PStatsList
, in modo che stai certamente permesso di aggiungere istanze di PStatsList
ad esso. Se non era permesso, il codice non avrebbe compilato o correre a tutti.
Se il ciclo viene eseguito volte N
, quindi MainList.Add
sarà chiamato volte N
, e MainList.Count
sarà N
. Quindi, se le stampe WriteLn(MainList.Count)
1
, allora possiamo solo concludere che N = 1
.
TList
consente duplicati, quindi, anche se MakeSubList
sta tornando lo stesso oggetto ogni volta, può ancora ottenere aggiunto alla lista principale più volte.
.. implementation type S64 = string[64]; art_ptr = ^art_rec; art_rec = record sDes: S64; rCost: real; iQty: integer; end; art_file = file of art_rec; var lCatalog: TList; procedure disp_all; var lArt: TList; pA: art_ptr; c, a: integer; begin for c:= 0 to lCatalog.Count -1 do begin lArt:= lCatalog[c]; for a:= 0 to lArt.Count -1 do begin pA:= lArt[a]; Dispose(pA); end; lArt.Clear; lArt.Free; end; lCatalog.Clear; end;// disp_all procedure TfrmMain.FormCreate(Sender: TObject); begin lCatalog:= TList.Create; end;// FormCreate procedure TfrmMain.FormDestroy(Sender: TObject); begin disp_all; lCatalog.Free; end;// FormDestroy // a normal BitButton click that adds 3 records to each art list (2) procedure TfrmMain.bbMCreate_Click(Sender: TObject); const nArt = 2; nRec = 3; var pA: art_ptr; lArt: TList; c: integer; begin // clears any previous added pointer record to art list that was added to the catalog disp_all; // creates art lists and add 'em to the catalog list for c:= 0 to nArt -1 do begin lArt:= TList.Create; lCatalog.Add(lArt); // creates records and add 'em to the art list for a:= 0 to nArt -1 do begin pA:= New(art_ptr); with pA^ do begin sDes:= Format('cat%d-art%d', [c, a]); rCost:= (c+1) * (a +1) *1.0; iQty:= (c+1) *10 + (a +1); end; lArt.Add(pA); end; end; end;// bbMCreate_Click // a normal BitButton click that reads 1 record from 1 art list procedure TfrmMain.bbMRead_Click(Sender: TObject); const c = 1; a = 2; var pA: art_ptr; lArt: TList; begin // gets art list #2 from catalog (index is 0 based. c=1) lArt:= lCatalog[c]; // gets record #3 from art list (index is 0 based. a=2) pA:= lArt[a]; // displays the record in a string grid called sgArt... at row a+1 with sgArt, pA^ do begin // col 0 contains cat index and art index, can be useful... cells[0,a+1]:= Format('\%d\%d', [c,a]); cells[1,a+1]:= sDes; cells[2,a+1]:= FormatFloat('0.00', rCost); cells[3,a+1]:= IntToStr(iQty); end; end;// bbMRead_Click