Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从linq列表中删除多个索引_C#_Linq - Fatal编程技术网

C# 从linq列表中删除多个索引

C# 从linq列表中删除多个索引,c#,linq,C#,Linq,我想从linq列表中删除多个索引,我使用以下代码: slidePart .Slide .Descendants<DocumentFormat.OpenXml.Presentation.Picture>() .ToList() .ForEach(pic => pic.Remove()); slidePart 滑动 .后代() 托利斯先生() .ForEach(pic=>pic.Remove()); 列表中

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

slidePart
         .Slide
         .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
         .ToList()
         .ForEach(pic => pic.Remove());
slidePart
滑动
.后代()
托利斯先生()
.ForEach(pic=>pic.Remove());
列表中有3个元素,现在我只想选择第一个和第三个元素,然后执行ForEach来删除它们

[编辑]

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

通常,您可以使用过滤器的索引重载来选择多个索引中的项目。请记住,LINQ只提供集合的视图(另一个集合实例),因此无法修改原始集合。如果
Remove
方法处理从其所有者处移除项目,这是可能的,但这将是一种非常特殊和罕见的情况

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

    slidePart.Slide
        .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
        .Where((x, i) => toRemove.Contains(i) )
        .ToList()
        .ForEach(pic => pic.Remove());
在您的情况下,获取项目将如下所示

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

var itemsToBeRemoved = slidePart.Slide
    .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
    .Where((pic, index) => toRemove.Contains(index))
    .ToList();
var toRemove=new[]{1,2,…};
var itemsToBeRemoved=slidePart.Slide
.后代()
其中((图片,索引)=>toRemove.Contains(索引))
.ToList();

但是为了能够删除项目,您可能需要在
子体
集合本身上调用某种
remove
方法,或者在您的场景中可能需要完全不同的方法。

首先,您不能通过
Foreach
循环修改集合。如果您有一组要删除的索引,只需调用
slidePart.RemoveAt(Index)
(注意索引从0开始)@Nogard我还指出,您需要以相反的顺序删除元素,从最高的索引开始。否则每次删除都会使索引混乱,并导致不正确的元素被删除(项目(0)被删除,导致项目(2)变成项目(1),等等。)@Mike确实应该在我的第一条评论
.ToList()中明确指定这一点问题中的
创建了一个全新的集合,可以在其中安全地枚举。没错,我更关心的是
pic=>pic.Remove()
部分。@HonzaBrestan OP的代码是完全安全的。它不在原始集合上枚举。也已编辑。L.B,也许我的答案不清楚,当然可以再次列举新的收藏并从原始收藏中删除-这只是另一个故事,不是对原始收藏进行查询的简单部分。@HonzaBrestan,但你重复我作为答案所写的内容。现在,出于性能原因,我将稍微更改我的答案。请不要复制这个。
var toRemove = new[] { 1, 2, ... };

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