C# 从linq列表中删除多个索引
我想从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()); 列表中
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();