2013-07-16 24 views
7

Ich analysiere ein Dataset und weise Werte zu TStringList zu Ich möchte die Duplikate vermeiden. Ich benutze den folgenden Code, aber es werden immer noch Duplikate eingefügt.Entfernen von Duplikaten aus 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; 

Warum werden die Duplikate hinzugefügt?

+1

BTW 'Dataset.FieldByName ('CHANNEL_INT')' ist langsam unsortierten Betrieb. Cache es in die 'var F: TField' vor dem Start der Schleife –

Antwort

21

Sie http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStringList.Duplicates gelesen haben, nicht wahr?

Dann verpasst man das wiederholte Wort gibt - "sortierte"

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 für die Antwort, auch der Benutzer ist nicht bewusst/kümmern sich um die Skalierbarkeit :) – RBA

+0

@RBA nun, ich denke, der Benutzer mit 2K + Karma sollte mindestens * weiß *, wenn nicht * Vorsicht *. Was ist mit '.Sorted' Miss ... naja ... wir alle machen immer wieder die doofsten Fehler trotz aller bisherigen Erfahrungen. Vielleicht war es nur sein schlechter Tag. :-) –

+0

Wahrscheinlich diese Art von Tag :) – RBA

8

aus der Box Denken und die Duplikate vorne vermeiden?

Ich weiß nicht, was DB Sie verwenden, sondern zum Beispiel auf SQL Server ist es nur eine Frage der Abfrage:

'SELECT DISTINCT CHANNEL_INT FROM MYTABLE'; 

und dann können Sie die Ergebnisse Ihrer TStringList ohne besorgt zu sein über Duplikate hinzufügen .

+2

Warum sollte man viele Ergebnisse abrufen und auf der Client-Seite herausfiltern? Wenn diese gefilterten Datensätze irgendwo anders in der Anwendung ignoriert werden, müssen sie nicht abgerufen werden, und dies ist die korrekteste Antwort. [+1] – TLama

+1

@TLama, wenn das die Abfrage ist, um die Liste zu füllen, ja. Aber es könnte die Abfrage mit einem anderen Ziel sein und eine Liste mit verschiedenen Werten zu erhalten ist nur - zum Beispiel - für den Grid-Autofilter. –

+1

@Arioch, das ist, was ich meinte - * Wenn diese gefilterten Datensätze irgendwo anders in der Anwendung ignoriert werden, gibt es keine Notwendigkeit, sie zu holen * ... – TLama