JavaScript splice in c#

9

C#是否有类似于JavaScript中的splice方法?

我只知道C#中的RemoveRange,但它不会返回被移除的元素:

List<string> t = new List<string>();
t.RemoveRange(..., ...);

我希望避免编写自己的集合类。


你到底想要什么? - Satpal
在一个方法中获取已删除对象的列表。 - BendEg
据我所知并没有找到相关的信息。但是你可以扩展List以实现该功能。Selman22提供了我所需要的答案。 - Michel de Nijs
如果C#内置此功能,那将非常棒,这样您可以在集合的一次遍历中删除和获取已删除的项目。 - Jeremy Armstrong
3个回答

18

没有确切的对应词,但你可以自己写一个:

public static List<T> Splice<T>(this List<T> source,int index,int count)
{
    var items = source.GetRange(index, count);
    source.RemoveRange(index,count);
    return items;
}

好的,这似乎是最好的解决方案。因为我避免了编写新的“Collection” :) 还有一件事,锁定集合在“GetRange”和“RemoveRange”期间是否是最好的选择? - BendEg
那么同时向集合中添加新元素呢?我正在寻找这个。我猜你得自己动手做。 - Bitterblue

7
如果拼接元素的数量大于列表中元素的数量,则GetRange()会抛出异常。更好的解决方案是:
    public static class ListExtension
    {
      public static List<T> Splice<T>(this List<T> source, int start, int size)
      {
          var items = source.Skip(start).Take(size).ToList<T>(); 
          if (source.Count >= size)
              source.RemoveRange(start, size);
          else 
              source.Clear();
          return items;
      }
    }

4

自 C# 8 版本起,你可以使用 C# Ranges

int[] someArray = new int[5] { 1, 2, 3, 4, 5 };
int[] subArray1 = someArray[0..2];               // { 1, 2 }
int[] subArray2 = someArray[1..^0];              // { 2, 3, 4, 5 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接