假设有一个List<UInt32>
因此,:
12|12
23|33
33|22
11|22
我需要删除第0个和第2个元素(List<UInt32>
)。但是,当我尝试foreach
此列表并首先删除0时,List会折叠其元素,1st会立即变为0 ..所以我不想删除错误的元素,因为我的另一个List<int>
包括我想删除的元素的位置。
无论如何,我想为此做一些算法,但我想知道是否已经解决了这个问题。
答案 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();