2013-07-16 60 views
7

データセットを解析して値をTStringListに割り当てていますが、重複を避けたいです。私は次のコードを使用しますが、重複は挿入されます。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; 

なぜ重複が追加されますか?

+1

BTW 'dataset.FieldByName( 'CHANNEL_INT')'は、低速のソートされていない操作です。 –

答えて

21

あなたはhttp://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStringList.Duplicatesを読んでいた、あなたはしませんでしたか?

次に、あなたが最も繰り返される単語を逃した -

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の答えの前に 'var F:TField'にキャッシュしてください。知っている*、そうでなければ*ケア*。 '。ソート'ミスについてはどうだろう...まあ...私たちは皆、以前に得た経験にもかかわらず、何度も最も愚かな過ちを繰り返すだろう。 :-) – RBA

+0

@RBAまあ、私は2K +カルマを持つユーザーは少なくともであるべきだと答えています:答えは –

+0

おそらくその種の日:) – RBA

8

を「ソート」箱から出して考えてみようとフロントアップの重複を避けるため?

私はあなたが使用しているDBを知りませんが、SQLサーバー上の例えばそれが照会するだけです:

'SELECT DISTINCT CHANNEL_INT FROM MYTABLE'; 

、その後、あなたは重複を心配することなく、あなたのTStringListに結果を追加することができます。

+2

なぜ、多くの結果を取り出し、クライアント側でフィルタリングするのでしょうか?フィルタリングされたレコードがアプリケーション内の他の場所で無視された場合、それらをフェッチする必要はなく、これが最も正しい答えです。 [+1] – TLama

+1

@TLamaそれがリストを満たすクエリーであれば、はい。しかし、それは異なる目標を持つクエリかもしれませんし、異なる値のリストを取得することは、例えば、グリッド自動フィルタリングのためだけです。 –

+1

@Arioch、それは私が意味していたものです*もしそれらのフィルタリングされたレコードがアプリケーションの他の場所で無視されれば、それらを取得する必要はありません* ... – TLama

関連する問題