2010-02-14 44 views
5

Tôi gặp vấn đề với tuyên bố foreach trong dự án của mình. Cho đến nay tôi có mã:Tuyên bố Foreach trong listbox

foreach(object i in listboxFiles.Items) 
    { 
     if (i == ".ftpquota") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == ".") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == "..") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
    } 

Tôi có điều này trong bộ hẹn giờ 1 giây. Nó nhận được tên mục tất cả các quyền, nhưng khi nó được các báo cáo if nó nói rằng họ không phù hợp, nhưng họ làm gì?

+1

Có điều này trong 1 giây. hẹn giờ nghe có vẻ như rất nhiều công việc ... những gì cho? Điều này có thực sự cần thiết không? nó sẽ là tốt hơn để thực thi mã này * chỉ * nếu danh sách thực sự thay đổi (có những sự kiện cho điều đó!). –

+0

Đó là bởi vì có một nút làm mới, nhưng tôi cho rằng tôi có thể có nó ở cuối nút – Crazyd22

Trả lời

6

Điều đầu tiên, bạn đang thay đổi bộ sưu tập trong khi lặp lại qua đó. Điều này không thể làm việc, do đó, mã của bạn về cơ bản bị hỏng.

Có một số cách để khắc phục điều này; đơn giản nhất trong trường hợp của bạn sẽ được sao chép bộ sưu tập các mặt hàng, lặp lại quá trình sao chép và thay đổi (= loại bỏ từ) bản gốc:

var items = new System.Collections.ArrayList(listboxFiles.Items); 

foreach (var item in items) { 
    if (item.Equals(".")) 
     listboxFiles.Items.remove(item); 
    … 
} 

Thứ hai, bạn đang so sánh một object đến một string, do đó các nhà điều hành == làm kiểm tra bình đẳng tham chiếu thay vì kiểm tra tính bình đẳng của chuỗi. Hoặc sử dụng Equals hoặc thực hiện một dàn diễn viên phù hợp.

+0

Hey, tôi đã thử điều này nhưng tôi không nhận được lỗi mà tôi không thể chuyển đổi một đối tượng thành một bool. Ngoài ra im nhận 'Không thể gán cho' i 'bởi vì nó là' biến lặp foreach ' – Crazyd22

+0

@Crazy: thử lại, sử dụng mã * my *. Bạn rõ ràng đã làm một cái gì đó khác nhau bởi vì mã của tôi không * không * cung cấp cho các lỗi này: Tôi không gán cho biến vòng lặp, và tôi không chuyển đổi sang một boolean. –

+0

Sẽ cố gắng cảm ơn này – Crazyd22

2

Kiểm tra bình đẳng không hoạt động vì bạn nên truyền tới chuỗi đầu tiên và thực hiện so sánh chuỗi thích hợp.

ví dụ:

if (string.Equals((string)i, ".ftpquota", StringComparison.Ordinal)) 

Nếu bạn xóa các mục khỏi tập hợp các mục trong khi lặp qua bộ sưu tập, bạn cũng có thể gặp rắc rối. Một cách để giải quyết vấn đề này là bắt đầu với mục cuối cùng và đếm lùi, do đó mọi lần xóa bạn thực hiện sẽ không ảnh hưởng đến các mục còn lại của bộ sưu tập, ví dụ:

for(var i = listboxFiles.Items.Count - 1; i >= 0; --i) 
{ 
    var item = listboxFiles[i]; 
    if (...) 
    { 
     listboxFiles.Items.RemoveAt(i); 
    } 
}