1

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

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

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

[编辑]

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

4

2 回答 2

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 });
于 2012-11-28T17:23:34.067 回答
0

通常,您可以使用过滤器的索引重载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或者在您的场景中可能需要完全不同的方法。

于 2012-11-28T17:30:43.677 回答