4
  1. How do I smartly initialize an Array with two (or more) other arrays in C#?

    double[] d1 = new double[5];
    double[] d2 = new double[3];
    double[] dTotal = new double[8]; // I need this to be {d1 then d2}
    
  2. Another question: How do I concatenate C# arrays efficiently?

2
  • 4
    If you have arrays that you need to change or mix and match like this, you should probably be use a generic List instead. Commented May 7, 2010 at 13:09
  • possible duplicate of How do I concatenate two arrays in C#? Commented Aug 8, 2013 at 14:37

5 Answers 5

9

You could use CopyTo:

double[] d1 = new double[5];
double[] d2 = new double[3];
double[] dTotal = new double[d1.Length + d2.Length];

d1.CopyTo(dTotal, 0);
d2.CopyTo(dTotal, d1.Length);
Sign up to request clarification or add additional context in comments.

4 Comments

Msdn is a little bit unclear, but the index parameter specifies the index in the destination array.
You need d1.length - 1, I believe
You're right; I misunderstood. Sorry. @Rubys: No, you don't.
First I copy 5 doubles from d1 to dTotal. Then I copy d2 to dTotal starting in index 5. If I use d1.Lenght - 1 I'll start at index 4 and I'll lost the last value of d1.
6
var dTotal = d1.Concat(d2).ToArray();

You could probably make it 'better' by creating dTotal first, and then just copying both inputs with Array.Copy.

2 Comments

This will be inefficient for large arrays.
@SLaks: That's why I added the little extra bit, but even for meduim size arrays (up to 10000 elements), you would probably not even notice the difference. Also Enumerable may provide a fast option for Concat if both are arrays (will have to look at source to confirm). Update: It does NOT have a fast option for anything.
5

You need to call Array.Copy, like this:

double[] d1 = new double[5];
double[] d2 = new double[3];
double[] dTotal = new double[d1.length + d2.length];

Array.Copy(d1, 0, dTotal, 0, d1.Length);
Array.Copy(d2, 0, dTotal, d1.Length, d2.Length);

Comments

0

Pretty old post but still actual.. Currently seems to be best solution to use collection expression as follows

var d1 = new double[5];
var d2 = new double[3];
var dTotal = [..d1, ..d2];

// Note: I prefer var on left side

This approach is pretty new, ok, but really short, readable (when you know about it) an effective as much as possible.. Code under the hood seems like this

double[] array = new double[5];
double[] array2 = new double[3];
double[] array3 = array;
double[] array4 = array2;
int num = 0;
double[] array5 = new double[array3.Length + array4.Length];
ReadOnlySpan<double> readOnlySpan = new ReadOnlySpan<double>(array3);
readOnlySpan.CopyTo(new Span<double>(array5).Slice(num, readOnlySpan.Length));
num += readOnlySpan.Length;
ReadOnlySpan<double> readOnlySpan2 = new ReadOnlySpan<double>(array4);
readOnlySpan2.CopyTo(new Span<double>(array5).Slice(num, readOnlySpan2.Length));
num += readOnlySpan2.Length;

and simply allocates final array and uses Spans and Slices to fill it. Awesome!

Comments

-1
using System.Linq;

int[] array1 = { 1, 3, 5 };
int[] array2 = { 0, 2, 4 };

// Concat array1 and array2.
var result1 = array1.Concat(array2).ToArray();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.