我有一个包含10个元素的数组X。我想创建一个新数组,包含X中从索引3开始并在索引7结束的所有元素。当然,我可以很容易地写一个循环,将它为我,但我想保持我的代码尽可能干净。c#中有一个方法可以帮我做这个吗?

类似(伪代码):

Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)

数组中。拷贝不符合我的需要。我需要在新数组中的项目是克隆。数组中。copy只是一个c风格的memcpy等效,这不是我要找的。


当前回答

就克隆而言,我认为序列化不会调用构造函数。如果你在ctor中做一些有趣的事情,这可能会破坏类不变量。

似乎更安全的方法是调用复制构造函数的虚拟克隆方法。

protected MyDerivedClass(MyDerivedClass myClass) 
{
  ...
}

public override MyBaseClass Clone()
{
  return new MyDerivedClass(this);
}

其他回答

您可以使用array . copy(…)在创建新数组后复制到新数组中,但我认为没有一个方法可以创建新数组并复制一系列元素。

如果你使用。net 3.5,你可以使用LINQ:

var newArray = array.Skip(3).Take(5).ToArray();

但这样做效率会低一些。

查看类似问题的答案,了解更具体情况下的选项。

我认为你要找的代码是:

阵列。复制(oldArray, 0, newArray,开始,EndIndex -开始)

使用扩展方法:

public static T[] Slice<T>(this T[] source, int start, int end)
    {
        // Handles negative ends.
        if (end < 0)
        {
            end = source.Length + end;
        }
        int len = end - start;

        // Return new array.
        T[] res = new T[len];
        for (int i = 0; i < len; i++)
        {
            res[i] = source[i + start];
        }
        return res;
    }

你可以使用它

var NewArray = OldArray.Slice(3,7);

下面的代码在一行中完成:

// Source array
string[] Source = new string[] { "A", "B", "C", "D" };
// Extracting a slice into another array
string[] Slice = new List<string>(Source).GetRange(2, 2).ToArray();

它不符合你的克隆要求,但它似乎比许多答案要简单:

Array NewArray = new ArraySegment(oldArray,BeginIndex , int Count).ToArray();