linq 从链接列表中删除多个索引

zazmityj  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(158)

我想从一个linq列表中删除多个索引,我正在使用下面的代码:

slidePart
         .Slide
         .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
         .ToList()
         .ForEach(pic => pic.Remove());

列表中有3个元素,现在我只想选择第1个和第3个元素,然后执行ForEach删除它们。

[编辑]

问题还在于索引是动态的。

bfnvny8b

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)

var toRemove = new HashSet<int>(new int[] { 1 });
nwsw7zdq

nwsw7zdq2#

通常,您可以使用Where筛选器的 indexed 重载来选择多个索引处的项。请记住,LINQ只提供集合的视图-另一个集合示例-因此您无法修改原始集合。如果Remove方法处理从项的所有者中删除项,则可能会出现这种情况,但这是非常特殊且罕见的情况。
在您的示例中,获取项目的方式如下所示

var toRemove = new[] { 1, 2, ... };

var itemsToBeRemoved = slidePart.Slide
    .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
    .Where((pic, index) => toRemove.Contains(index))
    .ToList();

但是为了能够移除这些项,您可能需要对Descendants集合本身调用某种Remove方法,或者在您的场景中可能需要完全不同的方法。

zour9fqk

zour9fqk3#

slidepart 
.RemoveAll(x => toRemove.Contains(slidepart.IndexOf(x))).ToList();

相关问题