2013-07-16 17 views
7

Sto analizzando un set di dati e assegnando valori a TStringList Voglio evitare i duplicati. Io uso il seguente codice ma sono ancora inseriti dei duplicati.Rimozione di duplicati da TStringList

channelList := TStringList.Create; 
    channelList.Duplicates := dupIgnore; 
    try 
    dataset.First; 
    while not dataset.EOF do 
    begin 
     channelList.Add(dataset.FieldByName('CHANNEL_INT').AsString) ; 
     dataset.Next; 
    end; 

perché vengono aggiunti i duplicati?

+1

BTW 'dataset.FieldByName ('CHANNEL_INT')' è un'operazione non ordinata lenta. Inseriscilo nella cache in 'var F: TField' prima dell'inizio del loop –

risposta

21

hai letto http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStringList.Duplicates, non è vero?

Poi vi siete persi la parola più ripetuta lì - "ordinato"

channelList.Sorted := true 

var F: TField; 

channelList := TStringList.Create; 
channelList.Sorted := True; 
channelList.Duplicates := dupIgnore; 

try 
    dataset.First; 
    F := dataset.FieldByName('CHANNEL_INT'); 
    while not dataset.EOF do 
    begin 
     channelList.Add(F.AsString); 
     dataset.Next; 
    end; 
+1

+1 per la risposta, anche se l'utente non è consapevole/si preoccupa della scalabilità :) – RBA

+0

@RBA beh, penso che l'utente con 2K + karma dovrebbe almeno * conosci *, se non * cura *. Che dire della mancanza di .Sorted ... beh ... tutti noi continuiamo a ripetere gli errori più stupidi una volta e l'altra nonostante qualsiasi esperienza acquisita prima Forse era solo la sua brutta giornata. :-) –

+0

Probabilmente quel tipo di giorno :) – RBA

8

pensare fuori dalla scatola ed evitare i duplicati in attacco?

Non so che cosa DB si utilizza, ma ad esempio su SQL server è solo una questione di interrogazione:

'SELECT DISTINCT CHANNEL_INT FROM MYTABLE'; 

e quindi è possibile aggiungere i risultati alla vostra TStringList senza essere preoccupati per i duplicati .

+2

Perché si dovrebbero recuperare molti risultati e filtrarli dal lato client. Se i record filtrati vengono ignorati in qualsiasi altro punto dell'applicazione, non è necessario recuperarli e questa è la risposta più corretta. [+1] – TLama

+1

@TLama se questa è la query per riempire l'elenco, sì. Ma potrebbe essere la query con un obiettivo diverso e ottenere un elenco di valori diversi è solo, ad esempio, per il filtro automatico della griglia. –

+1

@Arioch, questo è quello che intendevo - * Se quei record filtrati vengono ignorati in qualsiasi altro punto dell'applicazione, non è necessario recuperarli * ... – TLama

Problemi correlati