2014-04-08 42 views
7

Có chức năng tích hợp nào trong Delphi để xóa tất cả các chuỗi khỏi một số TStringList bị trống không?Xóa các chuỗi rỗng khỏi TStringList

Làm cách nào để lặp qua danh sách để xóa các mục này?

Trả lời

17

Để trả lời câu hỏi đầu tiên của bạn, không có chức năng tích hợp cho điều đó. Looping bằng tay rất dễ dàng. Điều này nên làm điều đó:

for I := mylist.count - 1 downto 0 do 
begin 
    if Trim(mylist[I]) = '' then 
    mylist.Delete(I); 
end; 

Lưu ý rằng vòng lặp for phải đi qua danh sách ngược lại bắt đầu từ Đếm 1 đến 0 để làm việc này.

Việc sử dụng Trim() là tùy chọn, tùy thuộc vào việc bạn có muốn xóa các chuỗi chỉ chứa khoảng trắng hay không. Thay đổi tuyên bố if thành if mylist[I] = '' then sẽ chỉ xóa các chuỗi hoàn toàn trống.

Dưới đây là một thói quen đầy đủ cho thấy các mã trong hành động:

procedure TMyForm.Button1Click(Sender: TObject); 
var 
    I: Integer; 
    mylist: TStringList; 
begin 
    mylist := TStringList.Create; 
    try 
    // Add some random stuff to the string list 
    for I := 0 to 100 do 
     mylist.Add(StringOfChar('y', Random(10))); 
    // Clear out the items that are empty 
    for I := mylist.count - 1 downto 0 do 
    begin 
     if Trim(mylist[I]) = '' then 
     mylist.Delete(I); 
    end; 
    // Show the remaining items with numbers in a list box 
    for I := 0 to mylist.count - 1 do 
     ListBox1.Items.Add(IntToStr(I)+' '+mylist[I]); 
    finally 
    mylist.Free; 
    end; 
end; 
+2

Đảo ngược ngược lại là rất quan trọng (+1). Có lẽ câu trả lời tốt hơn nên nói một từ về điều này thay vì nói chi tiết về một phần "tùy chọn". – Wolf

-1

Một cách khác mà loại bỏ sự overhead rằng Trim và Xóa công việc incur..should với bất kỳ đối tượng tương thích TStringList.

S := Memo1.Lines.Text; 

// trim the trailing whitespace 
While S[Length(S)] In [#10, #13] Do 
    System.Delete(S, Length(S), 1); 

// then do the rest 
For I := Length(S) DownTo 1 Do 
    If (S[I] = #13) And (S[I-1] = #10) Then 
    System.Delete(S, I, 2); 
+0

Giải pháp của bạn giới thiệu rất nhiều chi phí ** để hiểu ** nó. Nhưng nó bỏ lỡ để áp dụng văn bản cho 'Memo1.Lines.Text' sau quá trình chuẩn hóa. BTW này tương thích với 'TStrings' không chỉ' TStringList', hãy thử kiểm tra kiểu 'Memo1.Lines.Text'. – Wolf

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