ho implementato traduzione in un'applicazione mettendo tutte le stringhe in fase di esecuzione in un TStringList con:Come posso cercare più velocemente le coppie nome/valore in una lista TSL di Delphi?
procedure PopulateStringList;
begin
EnglishStringList.Append('CAN_T_FIND_FILE=It is not possible to find the file');
EnglishStringList.Append('DUMMY=Just a dummy record');
// total of 2000 record appended in the same way
EnglishStringList.Sorted := True; // Updated comment: this is USELESS!
end;
allora ottengo la traduzione utilizzando:
function GetTranslation(ResStr:String):String;
var
iIndex : Integer;
begin
iIndex := -1;
iIndex := EnglishStringList.IndexOfName(ResStr);
if iIndex >= 0 then
Result := EnglishStringList.ValueFromIndex[iIndex] else
Result := ResStr + ' (Translation N/A)';
end;
Comunque con questo approccio ci vogliono circa 30 microsecondi per individuare un record, c'è un modo migliore per ottenere lo stesso risultato?
UPDATE: Per riferimento futuro mi scrivere qui la nuova implementazione che utilizza TDictionary come suggerito (funziona con Delphi 2009 e successivi):
procedure PopulateStringList;
begin
EnglishDictionary := TDictionary<String, String>.Create;
EnglishDictionary.Add('CAN_T_FIND_FILE','It is not possible to find the file');
EnglishDictionary.Add('DUMMY','Just a dummy record');
// total of 2000 record appended in the same way
end;
function GetTranslation(ResStr:String):String;
var
ValueFound: Boolean;
begin
ValueFound:= EnglishDictionary.TryGetValue(ResStr, Result);
if not ValueFound then Result := Result + '(Trans N/A)';
end;
La nuova funzione GetTranslation esegue 1000 volte più veloce (sul mio 2000 record di esempio) quindi la prima versione.
Sebbene 'IndexOf' benefici da una TStringList che viene ordinata,' IndexOfName' no. Ciò non significa che * non sia * in alcune classi discendenti, ma TStringList non sovrascrive la ricerca lineare di base fornita da TStrings. –
Sì, ho controllato, è lo stesso (quindi posso risparmiare tempo a non ordinare l'elenco. Dal momento che non lo sto modificando, avrebbe più senso chiamare Sort, invece di impostare True ordinato (comunque non lo farò) Grazie – LaBracca