2009-04-08 49 views
0

假設存在的List<UInt32>是否有可能在我刪除特定時間後讓List崩潰?

列表因此,:

12|12 
23|33 
33|22 
11|22 

我需要刪除0級和第二個元素(List<UInt32>)。但是,當我嘗試foreach此列表並首先刪除0時,List將其元素摺疊並且1st將變爲0 now ..因此我不想刪除錯誤的元素,因爲我的另一個List<int>包含了我想要的元素的位置刪除。

無論如何,我想爲此做一些算法,但我想知道這個問題是否已經有解決方案。

+0

@Skuta,你不應該修改一個集合,當你使用它的枚舉器(這是foreach)迭代它。 – 2009-04-08 17:13:14

+0

@Michael:他正在列舉一個不同的列表並從另一個列表中移除,這沒有問題。 – Samuel 2009-04-08 17:16:50

回答

7

按降序對位置列表進行排序,並按照該順序刪除元素。

foreach (var position in positions.OrderByDescending(x=>x)) 
    list.RemoveAt(position); 
+0

好的,我不確定我應該在這裏做什麼。有列表其中包含需要從列表中刪除的位置。那段代碼在哪裏? – Skuta 2009-04-08 17:22:51

+0

@Skuta:'positions'是索引列表。 'list'是你想從中刪除的列表(它包含實際的數據)。 – 2009-04-08 17:24:01

+0

換句話說:從列表的*結尾*向下朝0方向刪除。 – 2009-04-08 18:00:08

1

您可以創建一個新集合並添加您不想刪除的項目,然後將新集合分配給原始項目。如果要刪除的索引位於散列集/字典中而不是列表中,那甚至可能比RemoveAt更快。

1

如果您使用的是C#3.0(或更高版本),則可以使用LINQ擴展方法Where來過濾您的列表。

var source = new List<int> { 1, 2, 3, 4, 5 }; 
var filter = new List<int> { 0, 2 }; 

var result = source.Where((n, i) => !filter.Contains(i)) // 2, 4, 5 

如果你想讓它回到List<int>,而不是IEnumerable<int>,只是使用ToList()

var list = result.ToList(); 
4

您是否能夠告訴你需要基於元素本身,而不是指數要刪除的元素?如果是這樣,你想改變現有列表,而不是創建新過濾一個,使用:

list.RemoveAll(x => (whatever - a predicate)); 

這是不是刪除在時間元素一個更有效的 - 每個元素都只有一次移動。它也更清晰,如果謂詞是明顯的:)