Coder Perfect

How can I copy a set of array elements into a new one?

Problem

I have a ten-element array X. I’d want to make a new array with all of the elements from X starting at index 3 and ending at index 7. Sure, I could construct a loop to do it for me, but I’d prefer to keep my code as simple as possible. Is there a C# technique that can help me with this?

Something along the lines of (pseudo code):

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

Array. Copy does not meet my requirements. I require clones of the elements in the new array. Array.copy is just a C-style memcpy counterpart; it’s not what I’m after.

Asked by user88637

Solution #1

It’s possible to include it as an extension method:

public static T[] SubArray<T>(this T[] data, int index, int length)
{
    T[] result = new T[length];
    Array.Copy(data, index, result, 0, length);
    return result;
}
static void Main()
{
    int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] sub = data.SubArray(3, 4); // contains {3,4,5,6}
}

Update on cloning (which wasn’t clear in the first inquiry). If you’re looking for a deep clone, try something like:

public static T[] SubArrayDeepClone<T>(this T[] data, int index, int length)
{
    T[] arrCopy = new T[length];
    Array.Copy(data, index, arrCopy, 0, length);
    using (MemoryStream ms = new MemoryStream())
    {
        var bf = new BinaryFormatter();
        bf.Serialize(ms, arrCopy);
        ms.Position = 0;
        return (T[])bf.Deserialize(ms);
    }
}

The objects must be serializable ([Serializable] or ISerializable) for this to work. Any other serializer, such as XmlSerializer, DataContractSerializer, protobuf-net, and so on, might easily be substituted.

Without serialization, deep cloning is difficult; in particular, ICloneable is difficult to trust in most circumstances.

Answered by Marc Gravell

Solution #2

You can make use of Array. After you’ve formed the new array, you can copy into it using Copy(…), but I don’t believe there’s a technique that constructs the new array and duplicates a range of elements.

If you have.NET 3.5 installed, you can use LINQ:

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

However, this will be less efficient.

For more particular instances, see this solution to a similar topic.

Answered by Jon Skeet

Solution #3

Have you explored ArraySegment as an option?

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

Answered by Alex Black

Solution #4

I see you’re interested in cloning rather than just copying references. You can utilise in this scenario. To project array members to their clones, select this option. If your elements used IClonable, for example, you could do something like this:

var newArray = array.Skip(3).Take(5).Select(eachElement => eachElement.Clone()).ToArray();

This method necessitates the use of the.NET Framework 3.

Answered by zvolkov

Solution #5

The following code accomplishes this in a single line:

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

Answered by Volker

Post is based on https://stackoverflow.com/questions/943635/how-do-i-clone-a-range-of-array-elements-to-a-new-array