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

类似(伪代码):

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

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


当前回答

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

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

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

但这样做效率会低一些。

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

其他回答

使用扩展方法:

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

这个怎么样:

public T[] CloneCopy(T[] array, int startIndex, int endIndex) where T : ICloneable
{
    T[] retArray = new T[endIndex - startIndex];
    for (int i = startIndex; i < endIndex; i++)
    {
        array[i - startIndex] = array[i].Clone();
    }
    return retArray;

}

然后,您需要在所有需要使用ICloneable的类上实现ICloneable接口,但这样就可以了。

我不确定它到底有多深,但是:

MyArray ToList < TSource >()。GetRange (beginningIndex, endIndex) . ToArray ()

这是一些开销,但它可能会减少一个不必要的方法。

你考虑过使用ArraySegment吗?

http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx

这很容易做到;

    object[] foo = new object[10];
    object[] bar = new object[7];   
    Array.Copy(foo, 3, bar, 0, 7);