从linq列表中删除多个索引

时间:2012-11-28 17:20:20

标签: c# linq

我想从linq列表中删除多个索引,我使用以下代码:

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

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

[编辑]

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

2 个答案:

答案 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方法,或者您的方案中可能需要采用完全不同的方法。