C# 集合上的拼接

C# 集合上的拼接,c#,collections,C#,Collections,在perl中,splice函数从现有数组返回一个新的项目数组,同时从现有数组中删除这些项目 my @newarry = splice @oldarray, 0, 250; @newarray现在将包含来自@oldarray的250条记录,@oldarray将减少250条记录 C#集合类(即数组、列表、队列、堆栈)是否有类似的功能?到目前为止,我只看到需要两个步骤(返回+删除)的解决方案 更新-不存在任何功能,因此我实现了一个扩展方法来支持拼接功能: public static List<

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

my @newarry = splice @oldarray, 0, 250;
@newarray
现在将包含来自
@oldarray
的250条记录,
@oldarray
将减少250条记录

C#集合类(即数组、列表、队列、堆栈)是否有类似的功能?到目前为止,我只看到需要两个步骤(返回+删除)的解决方案

更新-不存在任何功能,因此我实现了一个扩展方法来支持拼接功能:

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;
}
publicstaticlistplice(此列表源,int-Start,int-Size)
{
List retVal=Source.Skip(Start).Take(Size.ToList();
来源.删除范围(开始,大小);
返回返回;
}
通过以下单元测试-成功:

[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");

  }
}
[TestClass]
公共类列表测试
{
[测试方法]
公共作废列表策略()
{
var lst=新列表(){
“一个”,
“两个”,
“三”,
“四”,
“五个”
};
var newList=第一个拼接(0,2);
Assert.AreEqual(newList.Count,2);
断言为相等(第一计数,3);
Assert.AreEqual(新列表[0],“一”);
Assert.AreEqual(新列表[1],“2”);
Assert.AreEqual(lst[0],“三”);
主张平等(lst[1],“四”);
主张平等(lst[2],“五”);
}
}
只有和,它将返回并删除一个项目,而不是多个项目


如果你需要这种行为,你必须把它写在你的一个上面,但是也许你可以简单地把上面的一个包装起来。但是,您应该定义如果用户定义的元素数大于可用元素数,或者定义的元素数为零或更少,会发生什么情况

您可以使用扩展实现拼接方法。此方法只需获取一个范围(列表中引用对象的副本),然后从列表中删除对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SpliceExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            List<int> subset = numbers.Splice(3, 3);

            Console.WriteLine(String.Join(", ", numbers)); // Prints 1, 2, 3, 7, 8, 9
            Console.WriteLine(String.Join(", ", subset));  // Prints 4, 5, 6

            Console.ReadLine();
        }
    }

  static class MyExtensions
  {
      public static List<T> Splice<T>(this List<T> list, int index, int count)
      {
          List<T> range = list.GetRange(index, count);
          list.RemoveRange(index, count);
          return range;
      }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间拼接示例
{
班级计划
{
静态void Main(字符串[]参数)
{
列表编号=新列表{1,2,3,4,5,6,7,8,9};
列表子集=编号。拼接(3,3);
Console.WriteLine(String.Join(“,”,number));//打印1,2,3,7,8,9
Console.WriteLine(String.Join(“,”,subset));//打印4,5,6
Console.ReadLine();
}
}
静态类MyExtensions
{
公共静态列表拼接(此列表、整型索引、整型计数)
{
列表范围=List.GetRange(索引、计数);
列表。删除范围(索引、计数);
返回范围;
}
}
}

如果拼接元素的数量大于列表中元素的数量,则GetRange()和RemoveRange()方法会引发异常。更好的解决方案是使用Skip()和Take()并检查列表大小:

    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;
      }
    }
公共静态类ListExtension
{
公共静态列表拼接(此列表源,int开始,int大小)
{
var items=source.Skip(start).Take(size.ToList();
如果(source.Count>=大小)
来源.删除范围(开始,大小);
其他的
source.Clear();
退货项目;
}
}

在.NET集合类中没有直接等效项。当然,您可以编写自己的helper方法,该方法返回+删除。你打算如何使用这种方法?也许有一种更像C#ish的方法来实现它,而不是试图从Perl中继承模式。谢谢你-我已经创建了一个扩展方法来将拼接函数添加到列表中-这可能还可以进一步推广以支持IEnumerables。你可以用
Source.Skip(Start).Take(Size).ToList()替换
Source.GetRange(开始,大小)
。将您的更新作为答案发布并接受它,将使后代更容易找到您的解决方案,同时检查集合大小以避免不必要的更改exceptions@SADeveloper:提醒:回答您的问题,而不是将答案作为问题的一部分。