2012-01-02 43 views
3

刪除對象在Java中,我可以重複採集和使用方法Iterator.remove()http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html#remove()的Java模擬,從集合

這是非常handly和自然從中刪除某些對象。就像你正在冰箱裏尋找食物,扔掉過期日期的食物。如何在C#中做同樣的事情?

我想iterateclean-up集合在同一個循環。

有幾個相關的問題,例如How to iterate and update a list但我仍然無法找到此操作的精確複製在C#

回答

7

如果您使用的是List<T>,則有一個方便的方法來執行此操作(RemoveAll),它將刪除與謂詞(表示爲委託)相匹配的所有元素。例如:

List<Person> people = ...; 
people.RemoveAll(person => person.Age < 18); 
// Just the adults left now... 

這比向後迭代IMO更簡單。

當然,如果你樂於創造一個新名單相反,你可以使用LINQ:

var adults = people.Where(person => person.Age >= 18).ToList(); 
+0

我想明確使用'for'或'foreach'循環,因爲我想對每個項目執行一些操作。在此過程中,我想刪除過期的商品。你的建議只會刪除過時的項目,但它不允許我在其他項目上工作。 – javapowered 2012-01-02 21:14:07

+0

@javapowered:當然它。謂詞是爲每個項目調用的,其返回值控制着項目是否被移除。您可以在謂詞中進行工作,唯一不能做的就是替換項目(但可以更改將影響集合的引用類型的成員)。由於您無法在移除的項目上工作,因此要求您返回以便導致移除似乎不是問題。 – 2012-01-02 21:16:11

+0

@javapowered,另一個例子'var list = new List (){1,2,3,4,5,6};名單。RemoveAll(i => i%2 == 0);' – 2012-01-02 21:18:15

2

在C#中,你可以使用一個for循環遍歷集合,並在它刪除的項目 - 這將爲IList<T>收藏。

爲了安全,你應該向後

for(int i = coll.Count - 1; i >= 0; i--) 
{ 
    if(coll[i] == something) 
    { 
    coll.RemoveAt(i); 
    } 
} 

迭代如果你可以使用LINQ,看RemoveAll作爲喬恩斯基特建議。這將允許您從列表中刪除所有項目而無需迭代,但只需提供一個謂詞。

+0

這可能會導致異常。 – 2012-01-02 20:42:08

+0

@ DanielA.White - 回答更新。 – Oded 2012-01-02 20:45:42

2

只需使用for循環向後

List<string> collection = new List<String> { "Hello", "World", "One", "Two", "Three"}; 
collection.Dump("Original List"); 
for(int i = collection.Count-1; i>=0; i--) 
{ 
    if (collection[i] == "One"){ 
     collection.RemoveAt(i); 
    } 
} 
collection.Dump("After deleting"); 

計數順便說一句,這是來自Knuth books

編輯一個典型的例子:這個例子很好地工作在LINQPad - 用於演示的目的。轉儲()在VS中不起作用。

+1

只是想很明顯,這裏的關鍵是通過索引中刪除,並在反向工作不干擾其餘要搜索的列表的一部分。 – lincolnk 2012-01-02 20:48:45

+1

這是一個解決方案,但不好。對於那些東西,Jave有很好的'iterator',但是在C#中,我必須手動迭代... – javapowered 2012-01-02 21:17:50