收集拼接

SAD*_*per 5 c# collections

在perl中,splice函数从现有数组返回一个新的项目数组,同时从现有数组中删除这些项目.

my @newarry = splice @oldarray, 0, 250;
Run Code Online (Sandbox Code Playgroud)

@newarray现在将包含250条记录,@oldarray并且@oldarray减少250条记录.

是否存在C#集合类的等价物,即具有类似功能的Array,List,Queue,Stack?到目前为止,我只看到了需要两个步骤的解决方案(返回+删除).

更新 - 没有功能存在,所以我实现了一个extensio方法来支持Splice功能:

public static List<T>Splice<T>(this List<T> Source, int Start, int Size) 
{
  List<T> retVal = Source.Skip(Start).Take(Size).ToList<T>();
  Source.RemoveRange(Start, Size);
  return retVal;
}
Run Code Online (Sandbox Code Playgroud)

通过以下单元测试 - 成功:

[TestClass]
public class ListTest
{
  [TestMethod]
  public void ListsSplice()
  {
    var lst = new List<string>() {
      "one",
      "two",
      "three",
      "four",
      "five"
    };

    var newList = lst.Splice(0, 2);

    Assert.AreEqual(newList.Count, 2);
    Assert.AreEqual(lst.Count, 3);

    Assert.AreEqual(newList[0], "one");
    Assert.AreEqual(newList[1], "two");

    Assert.AreEqual(lst[0], "three");
    Assert.AreEqual(lst[1], "four");
    Assert.AreEqual(lst[2], "five");

  }
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*ver 0

只有Stack.Pop()andQueue.Dequeue()会返回并删除一项,但不会返回多项。

如果您需要这种行为,则必须将其写在您的行为上,但也许您可以简单地包装上述行为之一。但是您应该定义如果用户定义的数量大于可用元素或数量为零或更少时会发生什么。