我想从一个linq列表中删除多个索引,我正在使用下面的代码:
slidePart .Slide .Descendants<DocumentFormat.OpenXml.Presentation.Picture>() .ToList() .ForEach(pic => pic.Remove());
列表中有3个元素,现在我只想选择第1个和第3个元素,然后执行ForEach删除它们。
[编辑]
问题还在于索引是动态的。
bfnvny8b1#
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)很大,你可以通过稍微修改toRemove的声明,将搜索(Contains)的时间从O(n)减少到O(1)
toRemove
var toRemove = new HashSet<int>(new int[] { 1 });
nwsw7zdq2#
通常,您可以使用Where筛选器的 indexed 重载来选择多个索引处的项。请记住,LINQ只提供集合的视图-另一个集合示例-因此您无法修改原始集合。如果Remove方法处理从项的所有者中删除项,则可能会出现这种情况,但这是非常特殊且罕见的情况。在您的示例中,获取项目的方式如下所示
Where
Remove
var toRemove = new[] { 1, 2, ... }; var itemsToBeRemoved = slidePart.Slide .Descendants<DocumentFormat.OpenXml.Presentation.Picture>() .Where((pic, index) => toRemove.Contains(index)) .ToList();
但是为了能够移除这些项,您可能需要对Descendants集合本身调用某种Remove方法,或者在您的场景中可能需要完全不同的方法。
Descendants
zour9fqk3#
slidepart .RemoveAll(x => toRemove.Contains(slidepart.IndexOf(x))).ToList();
3条答案
按热度按时间bfnvny8b1#
如果你的列表(toRemove)很大,你可以通过稍微修改
toRemove
的声明,将搜索(Contains)的时间从O(n)减少到O(1)nwsw7zdq2#
通常,您可以使用
Where
筛选器的 indexed 重载来选择多个索引处的项。请记住,LINQ只提供集合的视图-另一个集合示例-因此您无法修改原始集合。如果Remove
方法处理从项的所有者中删除项,则可能会出现这种情况,但这是非常特殊且罕见的情况。在您的示例中,获取项目的方式如下所示
但是为了能够移除这些项,您可能需要对
Descendants
集合本身调用某种Remove
方法,或者在您的场景中可能需要完全不同的方法。zour9fqk3#