我想从linq列表中删除多个索引,我使用以下代码:
slidePart
.Slide
.Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
.ToList()
.ForEach(pic => pic.Remove());
列表中有3个元素,现在我想要的是只选择第1个和第3个元素,然后执行ForEach删除它们。
[编辑]
问题还在于索引是动态的。
答案 0 :(得分:3)
var toRemove = new int[] { 1,2,.... };
slidePart.Slide
.Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
.Where((x, i) => toRemove.Contains(i) )
.ToList()
.ForEach(pic => pic.Remove());
如果您的列表( toRemove )很大,您可以通过更改声明将搜索时间(包含)从O(n)减少到O(1) toRemove
一点点
var toRemove = new HashSet<int>(new int[] { 1 });
答案 1 :(得分:0)
通常,您可以使用{em> indexed 重载Where
过滤器来选择多个索引处的项目。请记住,LINQ只为您提供集合的视图 - 另一个集合实例 - 因此您无法修改原始集合。如果Remove
方法处理从其所有者中删除项目,则可能会这样做,但这将是一种非常特殊且极为罕见的情况。
在您的情况下,获取项目将如下所示
var toRemove = new[] { 1, 2, ... };
var itemsToBeRemoved = slidePart.Slide
.Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
.Where((pic, index) => toRemove.Contains(index))
.ToList();
但是为了能够删除这些项目,您可能需要在Remove
集合本身上调用某种Descendants
方法,或者您的方案中可能需要采用完全不同的方法。