当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-DeleteaListElementataGivenIndexShare

时间:2023-04-11 01:33:41 C#

DeleteaListElementataGivenIndex我有一个列表,其中包含一些字符串类型的项目。列出lstOriginal;我有另一个带有id的列表,应该从第一个列表中删除。列出lstIndices;我已经尝试使用RemoveAt()方法来完成这项工作,foreach(intindexinlstIndices){lstOriginal.RemoveAt(indices);但它崩溃并说我有“索引超出范围”。您需要对要返回的索引从最大到最小进行排序,以避免在错误的索引处丢失某些内容。foreach(intindexinlstIndices.OrderByDescending(v=>v)){lstOriginal.RemoveAt(indice);原因如下:假设您有一个包含五个项目的列表,并且您想要删除索引2和4。如果先删除位于2的项目,则位于索引4的项目将位于索引3,而索引4将不再是在列表中(导致您的异常)。如果你往回走,所有的索引都会在你准备好删除相应项目的那一刻。你是如何填写索引列表的?您可以使用更高效的RemoveAll方法。例如,而不是这样:varindices=newList();整数索引=0;foreach(varitemindata)if(SomeFunction(data))indices.Add(index++);//然后一些逻辑来删除你可以这样做的项目:data.RemoveAll(item=>SomeFunction(item));这最大限度地减少了将项目复制到数组中的新位置;每个项目只复制一次。您还可以在上面的示例中使用方法组转换而不是lambda:data.RemoveAll(SomeFunction);发生这种情况是因为当你从列表中删除一个项目时,每个项目的索引实际上减少了一个,所以如果你以递增的索引顺序删除它们,并且一些接近原始列表末尾的项目将被删除,那些索引是现在无效,因为删除之前的项目后列表会更短。最简单的解决方案是按降序对索引列表进行排序(最高索引在前),然后对其进行迭代。对于(inti=0;ivararray=lstOriginal.ConvertAll(item=>newint?(item)).ToArray();lstIndices.ForEach(index=>array[index]=null);lstOriginal=array.Where(item=>item.HasValue).Select(item=>item.Value).ToList();我就地删除给定的索引作为一种方便的扩展方法。它只复制所有项目一次,所以如果你想删除一个大数字标志,它会更有效。如果要删除的索引超出范围,它还会抛出ArgumentOutOfRangeException。publicstaticclassListExtensions{publicstaticvoidRemoveAllIndices(thisListlist,IEnumerableindices){//不要在此处删除Distinct()调用,这很重要varindicesOrdered=indices.Distinct().ToArray();如果(indicesOrdered.Length==0)返回;Array.Sort(indicesOrdered);如果(indicesOrdered[0]=list.Count)抛出新的ArgumentOutOfRangeException();intindexToRemove=0;intnewIdx=0;for(intoriginalIdx=0;originalIdxlstIndices.OrderByDescending(p=>p).ToList().ForEach(p=>lstOriginal.RemoveAt((int)p));作为旁注,在foreach语句中,最好不要去修改foreach运行的Ienumerable,越界错误可以是这种情况造成的,以上是C#学习教程:删除给定索引处的list元素共享的所有内容,如果有用给大家,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,转载请注明出处: