2013-07-16 88 views
7

Tôi đang phân tích cú pháp tập dữ liệu và gán giá trị cho TStringList tôi muốn tránh trùng lặp. Tôi sử dụng đoạn mã sau nhưng vẫn được sao chép.Xóa trùng lặp khỏi 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; 

tại sao các từ khóa trùng lặp được thêm vào?

+1

BTW 'dataset.FieldByName ('CHANNEL_INT')' là hoạt động chưa được phân loại chậm. Cache nó vào 'var F: TField' trước khi bắt đầu vòng lặp –

Trả lời

21

Bạn đã đọc http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStringList.Duplicates, phải không?

Sau đó, bạn bỏ lỡ từ lặp đi lặp lại hầu hết ở đó - "sắp xếp"

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 cho câu trả lời, ngay cả khi người dùng không nhận thức/quan tâm đến khả năng mở rộng :) – RBA

+0

@RBA tốt, tôi nghĩ người dùng có 2K + nghiệp nên ít nhất * biết *, nếu không * chăm sóc *. Điều gì về '.Sorted' bỏ lỡ ... ừm ... tất cả chúng ta đều giữ makinf những sai lầm ngu ngốc nhất một lần và một lần nữa mặc dù bất kỳ kinh nghiệm đã đạt được trước khi Có lẽ đó chỉ là ngày tồi tệ của mình. :-) –

+0

Có lẽ là loại ngày :) – RBA

8

suy nghĩ ra khỏi hộp và tránh các bản sao lên phía trước?

Tôi không biết những gì DB bạn đang sử dụng nhưng đối với ví dụ trên SQL server nó chỉ là một vấn đề của truy vấn:

'SELECT DISTINCT CHANNEL_INT FROM MYTABLE'; 

và sau đó bạn có thể thêm các kết quả để TStringList của bạn mà không bị lo lắng về bản sao .

+2

Tại sao một người sẽ tìm nạp nhiều kết quả và lọc chúng ra ở phía máy khách. Nếu những hồ sơ được lọc được bỏ qua bất cứ nơi nào khác trong ứng dụng, không cần phải lấy chúng và đây là câu trả lời đúng nhất. [+1] – TLama

+1

@TLama nếu đó là truy vấn để điền vào danh sách, có. Nhưng nó có thể là truy vấn với một mục tiêu khác và việc lấy danh sách các giá trị khác nhau chỉ là - ví dụ - đối với bộ lọc tự động lưới. –

+1

@ Arioch, đó là những gì tôi muốn nói - * Nếu những hồ sơ được lọc bị bỏ qua ở bất kỳ nơi nào khác trong ứng dụng, không cần tìm nạp chúng ... – TLama

Các vấn đề liên quan