在删除某些时间后,是否可以让List崩溃?

时间:2009-04-08 17:07:13

标签: c# list

假设有一个List<UInt32>

列表

因此,:

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

我需要删除第0个和第2个元素(List<UInt32>)。但是,当我尝试foreach此列表并首先删除0时,List会折叠其元素,1st会立即变为0 ..所以我不想删除错误的元素,因为我的另一个List<int>包括我想删除的元素的位置。

无论如何,我想为此做一些算法,但我想知道是否已经解决了这个问题。

4 个答案:

答案 0 :(得分:7)

按降序对排名列表进行排序,然后按顺序删除元素。

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

答案 1 :(得分:4)

您是否能够根据元素本身而不是索引来判断需要删除哪些元素?如果是这样,并且您想要更改现有列表而不是创建新过滤的列表,请使用:

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

这比一次删除一个元素更有效 - 每个元素只移动一次。如果谓词很明显,它也更清晰:)

答案 2 :(得分:1)

您可以创建新集合并添加不想删除的项目,然后将新集合分配给原始集合。如果要删除的索引位于哈希集/字典而不是列表中,那么甚至可能比RemoveAt更快。

答案 3 :(得分: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();