C# 在我删除某些时间后,是否可能让列表崩溃?

C# 在我删除某些时间后,是否可能让列表崩溃?,c#,list,C#,List,假设有一个list var list = result.ToList(); 因此: 12|12 23|33 33|22 11|22 我需要删除第0个和第2个元素(List)。但是,当我尝试foreach此列表并首先删除第0个元素时,该列表将折叠其元素,第1个元素现在变为第0个。。所以我不想删除错误的元素,因为我的另一个列表包含了我要删除的元素的位置 无论如何,我想做一些算法来解决这个问题,但我想知道这个问题是否已经有了解决方案。按降序排列位置列表,并按降序删除元素 foreach (var

假设有一个
list

var list = result.ToList();
因此:

12|12
23|33
33|22
11|22
我需要删除第0个和第2个元素(
List
)。但是,当我尝试
foreach
此列表并首先删除第0个元素时,该列表将折叠其元素,第1个元素现在变为第0个。。所以我不想删除错误的元素,因为我的另一个
列表包含了我要删除的元素的位置


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

按降序排列位置列表,并按降序删除元素

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

您可以创建一个新集合并添加不希望删除的项,然后将新集合分配给原始集合。如果要删除的索引位于哈希集/字典中而不是列表中,则这可能比删除更快。

如果使用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.RemoveAll(x => (whatever - a predicate));

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

@Skuta,在使用枚举器(foreach是这样做的)迭代集合时,不应该修改集合。@Michael:他正在枚举不同的列表并从另一个列表中删除,没有问题。好吧,我不确定在这里应该做什么。有一个列表,其中包含需要从列表中删除的职位。这段代码在哪里?@Skuta:
positions
是索引列表<代码>列表
是您要从中删除的列表(它包含实际数据)。换句话说:从列表末尾向下删除到0。