2010-02-14 30 views
5

我在項目中遇到了foreach語句的問題。到目前爲止,我的代碼是:列表框中的foreach語句

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); 
     } 
    } 

我在1秒計時器中有這個。它得到的項目名稱是好的,但是當它得到if聲明它說他們不匹配,但他們呢?

+1

在1秒內完成。定時器聽起來像很多工作......爲了什麼?這真的有必要嗎?執行此代碼會更好*僅當列表實際發生更改時(有事件發生!)。 – 2010-02-14 11:23:06

+0

這是因爲有一個刷新按鈕,但我想我可以在按鈕末端 – Crazyd22 2010-02-14 11:32:00

回答

6

首先,你正在改變一個集合,而迭代它。這是行不通的,所以你的代碼從根本上破壞了。

有幾種方法可以解決這個問題;你的情況最簡單的將是複製的項目集合,遍歷複製和改變(=從拆除)原:

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

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

其次,你是比較的objectstring,因此==符不引用相等性檢查而不是測試字符串相等性。要麼使用Equals要麼做適當的演員。

+0

嘿,我試過這個,但我沒有得到我無法將對象轉換爲布爾的錯誤。 '即時獲取'不能分配給'我',因爲它是一個'foreach迭代變量' – Crazyd22 2010-02-14 11:25:07

+0

@瘋狂:再次嘗試,使用*我的*代碼。你顯然做了一些不同的事情,因爲我的代碼不*給出這些錯誤:我沒有分配給循環變量,也沒有轉換爲布爾值。 – 2010-02-14 11:30:43

+0

將試試這個謝謝 – Crazyd22 2010-02-14 11:32:30

2

相等性檢查不起作用,因爲您應該先強制轉換字符串並進行適當的字符串比較。

例如

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

如果您在遍歷集合時從項目集合中刪除項目,則可能會遇到麻煩。解決此問題的一種方法是從最後一項開始並向後計數,因此所做的任何刪除都不會影響集合的其餘項目,例如,

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