Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-09-2014
JaviMarciano JaviMarciano is offline
Registrado
NULL
 
Registrado: sep 2014
Posts: 5
Poder: 0
JaviMarciano Va por buen camino
Tstrings Delphi 2007

hay una manera de hacer esto más eficiente:
necesito concatenar cada item de un Tstrings en en una cadena separado por espacios

Código Delphi [-]
function TOracle.GetStatement(StatementLines: TStrings): string;
var
  I: Integer;
  Statement: string;
begin
  Statement := '';
  for i := 0 to StatementLines.Count - 1 do
  begin
    Statement := Statement + ' ' + Trim(StatementLines[i]);
  end;
    Result := TrimLeft(Statement);
end;
es para delphi 2007
Responder Con Cita
  #2  
Antiguo 15-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola JaviMarciano.

Podes ahorrarte la variable Statement usando la variable implícita Result,
Código Delphi [-]
function GetStatement(StatementLines: TStrings): string;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to StatementLines.Count - 1 do
    Result := Result + Trim(StatementLines[i]) + ' ';
  SetLength(Result, Length(Result)-1);
end;


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 16-09-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Una alternativa podría ser algo así, pero tendrás que probar si realmente es más eficiente:

Código Delphi [-]
  Result := AnsiReplaceText(StatementLines.Text, sLineBreak, ' ');

Y añadir al uses la unit StrUtils.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 16-09-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Si no ando desencaminado y como para lo único que utilizas StatementLines es para obtener información igual es mas eficiente declararla como constante, habría que comprobarlo.
Código Delphi [-]
function GetStatement(const StatementLines: TStrings): string; 
var   
  i: Integer; 
begin   
  Result := '';   
  for i := 0 to StatementLines.Count - 1 do
    Result := Result + Trim(StatementLines[i]) + ' ';   
  SetLength(Result, Length(Result)-1); 
end;
Responder Con Cita
  #5  
Antiguo 16-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Muy buena la opción de Neftali (no me acordé de ella) a la que se le podría sumar ExtractStrings de la unit Classes.

Para salir de dudas sobre la eficiencia de usar una u otra alternativa, hice una prueba sobre un archivo de texto de 22350 líneas con este código:
Código Delphi [-]
...
uses StrUtils;

var
  frec, ini, fin: Int64;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:\PRUEBA.TXT');
  Caption:= Format('Nro lineas: %d', [Memo1.Lines.Count[);
  QueryPerformanceFrequency(frec);
end;

// Usando for para concatenar
function Concat1(Lineas: TStrings): string;
var
  i: Integer;
begin
  Result := '';
  Lineas.BeginUpdate;
  try
    for i := 0 to Lineas.Count - 1 do
      Result := Result + Trim(Lineas[i]) + ' ';
    SetLength(Result, Length(Result)-1);
  finally
    Lineas.EndUpdate;
  end;
end;

// Usando AnsiReplaceText para concatenar
function Concat2(Lineas: TStrings): string;
begin
  Result:= AnsiReplaceText(Lineas.Text, sLineBreak, ' ');
end;

procedure TForm1.btnForClick(Sender: TObject);
begin
  Memo2.Clear;
  QueryPerformanceCounter(ini);
  Memo2.Text:= Concat1(Memo1.Lines);
  QueryPerformanceCounter(fin);
  Label1.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;

procedure TForm1.btnExtClick(Sender: TObject);
begin
  Memo2.Clear;
  QueryPerformanceCounter(ini);
  Memo2.Text:= Concat2(Memo1.Lines);
  QueryPerformanceCounter(fin);
  Label2.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;
(Mientras escribía la prueba recordé agreguar EnableControls y DisiableControls para mejorar la performance.)

El resultado promedio de 3 mediciones:
  • Procedimiento Concat1: 1.411.396 ms
  • Procedimiento Concat2: 7.415.044 ms

La balanza se inclina a recorrer el TStrings con un for y creo que es debido a que AnsiReplaceText debe realizar comprobaciones adicionales para lograr su gran ductilidad de uso.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
crear un grafico en excel 2007 desde Delphi 2007 Jose Manuel Varios 1 27-12-2013 19:56:30
Tstrings en datasnap juank1971 Conexión con bases de datos 4 25-05-2011 21:31:40
¿Delphi 2007 for win32 o BSD 2007? AzidRain La Taberna 6 29-07-2008 20:32:16
TStrings dvlt Varios 7 15-04-2008 15:36:37
Lanzamiento Delphi 2007, PHP y JBuilder 2007 R2 Santiago - Chile Andreano Noticias 4 14-05-2007 09:25:23


La franja horaria es GMT +2. Ahora son las 17:03:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi