¿Cómo concateno dos matrices en C #?

267
int[] x = new int [] { 1, 2, 3};
int[] y = new int [] { 4, 5 };

int[] z = // your answer here...

Debug.Assert(z.SequenceEqual(new int[] { 1, 2, 3, 4, 5 }));

Ahora mismo uso

int[] z = x.Concat(y).ToArray();

¿Existe un método más fácil o más eficiente?

hwiechers
fuente
8
¿Qué quieres decir con "eficiente"? El código es lo suficientemente corto como es, así que supongo que te refieres a eficiente en términos de CPU / RAM.
TToni
44
No, un vistazo rápido con Reflector muestra que utiliza un búfer doble cuando está lleno
erikkallen
Solo sea claro, necesito que z sea un tipo int [].
hwiechers
44
Realmente no estoy tan preocupado por la eficiencia. (Dije más fácil o más eficiente). Hice la pregunta para verificar cómo otras personas manejaban esta tarea común.
hwiechers

Respuestas:

331
var z = new int[x.Length + y.Length];
x.CopyTo(z, 0);
y.CopyTo(z, x.Length);
Zed
fuente
8
@manthrax -> En su defensa, C # tiende a favorecer listas que son mucho más poderosas que las matrices. Parece que el único propósito funcional para usar matrices es para llamadas Interop (C ++ no administrado).
Levi Fuller
@LeviFuller Otro lugar donde C # usa la matriz es con paramsparámetros de número variable .
ChrisW
1
@LeviFuller: es extraño que muchas rutinas del sistema devuelvan matrices en lugar de listas. Por ejemplo, System.IO.Directory.GetFiles()devuelve una matriz de cadenas.
orion elenzil
44
Esto no es extraño. Una matriz es inmutable, una lista no lo es. Además, una Lista usa más memoria que una matriz, a menos que se llame a TrimExcess (que no ocurre en ToList)
CSharpie
1
Además, la matriz es más rápida que la lista al acceder a los datos, porque la lista simplemente envuelve la matriz dentro y tiene una sobrecarga para llamar al indexador.
C0DEF52
84

Prueba esto:

List<int> list = new List<int>();
list.AddRange(x);
list.AddRange(y);
int[] z = list.ToArray();
Adriaan Stander
fuente
55
O inclusoList<int> list = new List<int>(x);
Matthew Scharley
77
¿Cómo es eso más eficiente que x.Concat (y)? Funciona y todo, solo me pregunto si hay algo que lo mejore.
Mike Two
77
es posible que desee hacer la primera línea Lista <int> lista = nueva Lista <int> (x.Length + y.Length); Para evitar el cambio de tamaño que podría suceder al llamar a AddRange
Mike Two
55
@Mathew Scharley. La pregunta es pedir una solución más eficiente. Sé que el título hace que suene como cualquier combinación anterior, pero la pregunta completa va más allá de eso. Al leer algunas de las respuestas, siento que algunas personas están respondiendo el título. Así que pensé que esta respuesta probablemente debería mencionar la eficiencia si merece los votos positivos, ya que ese parecía ser el punto de la pregunta.
Mike Two
2
Resulta que AddRange es en realidad un proceso bastante costoso, por lo que la primera respuesta en este foro debería ser el enfoque preferido: dotnetperls.com/insertrange
Liam
49

Podrías escribir un método de extensión:

public static T[] Concat<T>(this T[] x, T[] y)
{
    if (x == null) throw new ArgumentNullException("x");
    if (y == null) throw new ArgumentNullException("y");
    int oldLen = x.Length;
    Array.Resize<T>(ref x, x.Length + y.Length);
    Array.Copy(y, 0, x, oldLen, y.Length);
    return x;
}

Luego:

int[] x = {1,2,3}, y = {4,5};
int[] z = x.Concat(y); // {1,2,3,4,5}
Marc Gravell
fuente
1
¿No existe ya un método de extensión que funcione en cualquier IEnumerable?
Mike Two
2
Sí, y lo usaría felizmente en la mayoría de los casos. Pero tienen muchos gastos generales. Depende; El 98% de las veces los gastos generales están bien. Sin embargo, si está en el 2%, entonces es útil algún trabajo directo de memcopy / array.
Marc Gravell
1
@nawfal, ¿cómo es Copymás rápido que CopyTo? ¿Cuidado para elaborar?
skrebbel el
1
@skrebbel mine fue un comentario inexacto. Hice algunas pruebas en ese entonces y encontré Copiar más rápido. Pero ahora parece que son iguales. Lo que podría haber encontrado en ese momento podría ser que, en general, el enfoque de Marc es más eficiente, ya que está pasando la misma instancia mientras que en el enfoque de Zed está creando una nueva matriz. Disculpas :)
nawfal
1
@Shimmy No lo haría. Dentro de este método, x no es más que una variable local, pasar x como una referencia al método de cambio de tamaño crearía una nueva matriz y alteraría (la variable local) x para señalarla. O para reformular: x pasado al cambio de tamaño yx dentro del método de extensión es la misma variable, pero x no se pasa al método de extensión como una referencia, por lo que x es una variable diferente de la variable en el ámbito desde el que se llamó a esta extensión .
AnorZaken
40

Me decidí por una solución de uso más general que permite concatenar un conjunto arbitrario de matrices unidimensionales del mismo tipo. (Estaba concatenando 3+ a la vez).

Mi funcion:

    public static T[] ConcatArrays<T>(params T[][] list)
    {
        var result = new T[list.Sum(a => a.Length)];
        int offset = 0;
        for (int x = 0; x < list.Length; x++)
        {
            list[x].CopyTo(result, offset);
            offset += list[x].Length;
        }
        return result;
    }

Y uso:

        int[] a = new int[] { 1, 2, 3 };
        int[] b = new int[] { 4, 5, 6 };
        int[] c = new int[] { 7, 8 };
        var y = ConcatArrays(a, b, c); //Results in int[] {1,2,3,4,5,6,7,8}
deepee1
fuente
Buena función, gracias! Cambiado params T[][]a this T[][]para que sea una extensión.
Mark
Hola chicos, esta función se parece a lo que estaba buscando, pero ¿alguna idea de cómo puedo lograr esto? enlace @ Mark
George B
31

Eso es todo:

using System.Linq;

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

// Concatenate array1 and array2.
var result1 = array1.Concat(array2);
Roland
fuente
44
Quiere decir int[] result = array1.ToList().Concat(array2.ToList()).toArray();que no puede aplicar Concat en matrices directamente, creo
Michail Michailidis
44
Esta solución, z = x.Concat (y), se menciona en la pregunta original anterior.
Jon Schneider
1
Esto es lo que sucede sin eltoArray() Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to 'string[]'. An explicit conversion exists (are you missing a cast?)
Tibor Udvari
2
Esta no es una respuesta directa. OP solicitó int[] result = ?, está ocultando el problema de su respuesta detrás de usted varen que su resultado será IEnumerable<int>, no int[]. (una de las razones por las que no me gustan las vardevoluciones de métodos)
David S.
2
Este método es el que se usa en la pregunta, por lo que esta respuesta no proporciona información nueva y, sin la .ToArray()llamada, este código no devolverá una matriz real, por lo que también es una respuesta incorrecta.
Mani Gandham
10

Puede quitar la llamada ToArray () al final. ¿Hay alguna razón por la que necesita que sea una matriz después de la llamada a Concat?

Llamar a Concat crea un iterador sobre ambas matrices. No crea una nueva matriz, por lo que no ha utilizado más memoria para una nueva matriz. Cuando llama a ToArray, en realidad crea una nueva matriz y ocupa la memoria de la nueva matriz.

Entonces, si solo necesita iterar fácilmente sobre ambos, simplemente llame a Concat.

Mike dos
fuente
8

Sé que el OP solo tenía un poco de curiosidad sobre el rendimiento. Que las matrices más grandes pueden obtener un resultado diferente (ver @kurdishTree). Y eso generalmente no importa (@ jordan.peoples). Sin embargo, tenía curiosidad y, por lo tanto, perdí la cabeza (como explicaba @TigerShark) ... quiero decir que escribí una prueba simple basada en la pregunta original ... y todas las respuestas ...

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

namespace concat
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] x = new int [] { 1, 2, 3};
            int[] y = new int [] { 4, 5 };


            int itter = 50000;
            Console.WriteLine("test iterations: {0}", itter);

            DateTime startTest = DateTime.Now;
            for(int  i = 0; i < itter; i++)
            {
                int[] z;
                z = x.Concat(y).ToArray();
            }
            Console.WriteLine ("Concat Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks );

            startTest = DateTime.Now;
            for(int  i = 0; i < itter; i++)
            {
                var vz = new int[x.Length + y.Length];
                x.CopyTo(vz, 0);
                y.CopyTo(vz, x.Length);
            }
            Console.WriteLine ("CopyTo Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks );

            startTest = DateTime.Now;
            for(int  i = 0; i < itter; i++)
            {
                List<int> list = new List<int>();
                list.AddRange(x);
                list.AddRange(y);
                int[] z = list.ToArray();
            }
            Console.WriteLine("list.AddRange Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] z = Methods.Concat(x, y);
            }
            Console.WriteLine("Concat(x, y) Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] z = Methods.ConcatArrays(x, y);
            }
            Console.WriteLine("ConcatArrays Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] z = Methods.SSConcat(x, y);
            }
            Console.WriteLine("SSConcat Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int k = 0; k < itter; k++)
            {
                int[] three = new int[x.Length + y.Length];

                int idx = 0;

                for (int i = 0; i < x.Length; i++)
                    three[idx++] = x[i];
                for (int j = 0; j < y.Length; j++)
                    three[idx++] = y[j];
            }
            Console.WriteLine("Roll your own Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);


            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] z = Methods.ConcatArraysLinq(x, y);
            }
            Console.WriteLine("ConcatArraysLinq Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] z = Methods.ConcatArraysLambda(x, y);
            }
            Console.WriteLine("ConcatArraysLambda Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                List<int> targetList = new List<int>(x);
                targetList.Concat(y);
            }
            Console.WriteLine("targetList.Concat(y) Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);

            startTest = DateTime.Now;
            for (int i = 0; i < itter; i++)
            {
                int[] result = x.ToList().Concat(y.ToList()).ToArray();
            }
            Console.WriteLine("x.ToList().Concat(y.ToList()).ToArray() Test Time in ticks: {0}", (DateTime.Now - startTest).Ticks);
        }
    }
    static class Methods
    {
        public static T[] Concat<T>(this T[] x, T[] y)
        {
            if (x == null) throw new ArgumentNullException("x");
            if (y == null) throw new ArgumentNullException("y");
            int oldLen = x.Length;
            Array.Resize<T>(ref x, x.Length + y.Length);
            Array.Copy(y, 0, x, oldLen, y.Length);
            return x;
        }

        public static T[] ConcatArrays<T>(params T[][] list)
        {
            var result = new T[list.Sum(a => a.Length)];
            int offset = 0;
            for (int x = 0; x < list.Length; x++)
            {
                list[x].CopyTo(result, offset);
                offset += list[x].Length;
            }
            return result;
        }


        public static T[] SSConcat<T>(this T[] first, params T[][] arrays)
        {
            int length = first.Length;
            foreach (T[] array in arrays)
            {
                length += array.Length;
            }
            T[] result = new T[length];
            length = first.Length;
            Array.Copy(first, 0, result, 0, first.Length);
            foreach (T[] array in arrays)
            {
                Array.Copy(array, 0, result, length, array.Length);
                length += array.Length;
            }
            return result;
        }

        public static T[] ConcatArraysLinq<T>(params T[][] arrays)
        {
            return (from array in arrays
                    from arr in array
                    select arr).ToArray();
        }

        public static T[] ConcatArraysLambda<T>(params T[][] arrays)
        {
            return arrays.SelectMany(array => array.Select(arr => arr)).ToArray();
        }
    }

}

El resultado fue:

ingrese la descripción de la imagen aquí

Tira tus propias victorias.

amalgamar
fuente
Para ser justos con los métodos que usaron los métodos, los Métodos probablemente agregaron aproximadamente 10,000 ticks en mi sistema.
amalgamate
1
Ejecuté su código en Visual Studio 2013 en modo de lanzamiento y descubrí que, si la matriz probada no es tan pequeña como la suya (como 1000 elementos), CopyToserá la más rápida y ~ 3 veces más rápida que Roll your own.
Sr. Ree
@ Mr.Ree Sí, mi matriz era realmente pequeña, ¿no? Gracias. Estaría interesado en ver si Block copy funciona aún mejor ...
amalgamate
7

Ten cuidado con el Concatmétodo. La Concatenación de matriz posterior en C # explica que:

var z = x.Concat(y).ToArray();

Será ineficiente para grandes matrices. Eso significa que el Concatmétodo es solo para matrices de tamaño mediano (hasta 10000 elementos).

kurdishTree
fuente
2
¿Qué se debe hacer con las matrices que contienen más de 10,000 elementos?
alex
6
public static T[] Concat<T>(this T[] first, params T[][] arrays)
{
    int length = first.Length;
    foreach (T[] array in arrays)
    {
        length += array.Length;
    }
    T[] result = new T[length];
    length = first.Length;
    Array.Copy(first, 0, result, 0, first.Length);
    foreach (T[] array in arrays)
    {
        Array.Copy(array, 0, result, length, array.Length);
        length += array.Length;
    }
    return result;
}
Sergey Shteyn
fuente
2
En StackOverflow, no solo pegue el código, sino que también explique su enfoque. En este caso específico, es posible que también deba explicar lo que su respuesta tardía agrega a las respuestas ya dadas (y aceptadas)
Gert Arnold
1
No estoy seguro de qué está haciendo "esto" antes del primer parámetro, pero por lo demás, esta es una función excelente. Genérico, y con una cantidad infinita de parámetros.
Nyerguds
2
Hola nyerguds Para responder a su pregunta, la palabra clave "this" se usa para hacer de la función un método de extensión. Para obtener más información sobre los métodos de extensión, consulte este artículo de MSDN
JFish222
6

Más eficiente (más rápido) para utilizar Buffer.BlockCopysobre Array.CopyTo,

int[] x = new int [] { 1, 2, 3};
int[] y = new int [] { 4, 5 };

int[] z = new int[x.Length + y.Length];
var byteIndex = x.Length * sizeof(int);
Buffer.BlockCopy(x, 0, z, 0, byteIndex);
Buffer.BlockCopy(y, 0, z, byteIndex, y.Length * sizeof(int));

Escribí un programa de prueba simple que "calienta el Jitter", compilado en modo de lanzamiento y lo ejecuté sin un depurador conectado, en mi máquina.

Para 10,000,000 iteraciones del ejemplo en la pregunta

Concat tomó 3088 ms

CopyTo tardó 1079ms

BlockCopy tardó 603 ms

Si modifico las matrices de prueba a dos secuencias de 0 a 99, obtengo resultados similares a este,

Concat tomó 45945 ms

CopyTo tardó 2230 ms

BlockCopy tardó 1689ms

A partir de estos resultados, puedo afirmar que los métodos CopyToy BlockCopyson significativamente más eficientes Concaty, además, si el rendimiento es un objetivo, BlockCopytiene valor sobreCopyTo .

Para advertir esta respuesta, si el rendimiento no importa, o habrá pocas iteraciones, elija el método que le resulte más fácil. Buffer.BlockCopyofrece alguna utilidad para la conversión de tipos más allá del alcance de esta pregunta.

Jodrell
fuente
6

Respuesta tardía :-).

public static class ArrayExtention
    {

        public static T[] Concatenate<T>(this T[] array1, T[] array2)
        {
            T[] result = new T[array1.Length + array2.Length];
            array1.CopyTo(result, 0);
            array2.CopyTo(result, array1.Length);
            return result;
        }

    }
Saleh Saeednia
fuente
3

La estructura más eficiente en términos de RAM (y CPU) para mantener la matriz combinada sería una clase especial que implemente IEnumerable (o si lo desea, incluso se deriva de Array) y se vincula internamente a las matrices originales para leer los valores. AFAIK Concat hace exactamente eso.

Sin embargo, en su código de muestra podría omitir .ToArray (), lo que lo haría más eficiente.

TToni
fuente
3

Lamento revivir un hilo viejo, pero ¿qué tal esto?

static IEnumerable<T> Merge<T>(params T[][] arrays)
{
    var merged = arrays.SelectMany(arr => arr);

    foreach (var t in merged)
        yield return t;
}

Luego en tu código:

int[] x={1, 2, 3};
int[] y={4, 5, 6};

var z=Merge(x, y);  // 'z' is IEnumerable<T>

var za=z.ToArray(); // 'za' is int[]

Hasta que llame .ToArray(), .ToList()o .ToDictionary(...)la memoria no esté asignada, tiene la libertad de "construir su consulta" y llamar a uno de esos tres para ejecutarla o simplemente revisarlos todos utilizando la foreach (var i in z){...}cláusula que devuelve un elemento a la vezyield return t; encima...

La función anterior se puede convertir en una extensión de la siguiente manera:

static IEnumerable<T> Merge<T>(this T[] array1, T[] array2)
{
    var merged = array1.Concat(array2);

    foreach (var t in merged)
        yield return t;
}

Entonces, en el código, puede hacer algo como:

int[] x1={1, 2, 3};
int[] x2={4, 5, 6};
int[] x3={7, 8};

var z=x1.Merge(x2).Merge(x3);   // 'z' is IEnumerable<T>

var za=z.ToArray(); // 'za' is int[]

El resto es igual que antes.

Otra mejora a esto sería cambiar T[]a IEnumerable<T>(por lo que params T[][]se convertiría enparams IEnumerable<T>[] ) para hacer estas funciones aceptan más de matrices sólo.

Espero que esto ayude.

nurchi
fuente
2

Puede hacerlo de la forma en que se ha referido, o si desea obtener un manual realmente al respecto, puede rodar su propio bucle:

        string[] one = new string[] { "a", "b" };
        string[] two = new string[] { "c", "d" };
        string[] three;

        three = new string[one.Length + two.Length];

        int idx = 0;

        for (int i = 0; i < one.Length; i++)
            three[idx++] = one[i];
        for (int j = 0; j < two.Length; j++)
            three[idx++] = two[j];
grito de terror
fuente
@nawfal Creo que eso dependerá del tamaño de la matriz. Esto ganó mi pequeña prueba de tamaño de matriz.
amalgamate
2

He encontrado una solución elegante de una línea usando LINQ o expresión Lambda , ambas funcionan igual (LINQ se convierte a Lambda cuando se compila el programa). La solución funciona para cualquier tipo de matriz y para cualquier número de matrices.

Usando LINQ:

public static T[] ConcatArraysLinq<T>(params T[][] arrays)
{
    return (from array in arrays
            from arr in array
            select arr).ToArray();
}

Usando Lambda:

public static T[] ConcatArraysLambda<T>(params T[][] arrays)
{
    return arrays.SelectMany(array => array.Select(arr => arr)).ToArray();
}

He proporcionado ambos para la preferencia de uno. Las soluciones de @Sergey Shteyn o @ deepee1 en cuanto al rendimiento son un poco más rápidas, siendo la expresión de Lambda la más lenta. El tiempo necesario depende del tipo o tipos de elementos de la matriz, pero a menos que haya millones de llamadas, no hay una diferencia significativa entre los métodos.

Marko Grešak
fuente
1

Lo que debe recordar es que cuando usa LINQ está utilizando una ejecución retrasada. Los otros métodos descritos aquí funcionan perfectamente, pero se ejecutan de inmediato. Además, la función Concat () probablemente está optimizada de formas que no puede hacer usted mismo (llamadas a API internas, llamadas al sistema operativo, etc.). De todos modos, a menos que realmente necesites probar y optimizar, actualmente estás en tu camino hacia "la raíz de todo mal";)

Siewers
fuente
1

Intenta lo siguiente:

T[] r1 = new T[size1];
T[] r2 = new T[size2];

List<T> targetList = new List<T>(r1);
targetList.Concat(r2);
T[] targetArray = targetList.ToArray();
کی‌راد عباسی
fuente
1

Aquí está mi respuesta:

int[] z = new List<string>()
    .Concat(a)
    .Concat(b)
    .Concat(c)
    .ToArray();

Este método se puede utilizar en el nivel de inicialización, por ejemplo, para definir una concatenación estática de matrices estáticas:

public static int[] a = new int [] { 1, 2, 3, 4, 5 };
public static int[] b = new int [] { 6, 7, 8 };
public static int[] c = new int [] { 9, 10 };

public static int[] z = new List<string>()
    .Concat(a)
    .Concat(b)
    .Concat(c)
    .ToArray();

Sin embargo, viene con dos advertencias que debe tener en cuenta:

  • El Concat método crea un iterador sobre ambas matrices: no crea una nueva matriz, por lo tanto, es eficiente en términos de memoria utilizada: sin embargo, la posterior  ToArray  negará dicha ventaja, ya que en realidad creará una nueva matriz y ocupará la memoria para el nueva matriz
  • Como dijo @Jodrell, Concatsería bastante ineficiente para matrices grandes: solo debería usarse para matrices medianas.

Si el objetivo es lograr el rendimiento, se puede utilizar el siguiente método:

/// <summary>
/// Concatenates two or more arrays into a single one.
/// </summary>
public static T[] Concat<T>(params T[][] arrays)
{
    // return (from array in arrays from arr in array select arr).ToArray();

    var result = new T[arrays.Sum(a => a.Length)];
    int offset = 0;
    for (int x = 0; x < arrays.Length; x++)
    {
        arrays[x].CopyTo(result, offset);
        offset += arrays[x].Length;
    }
    return result;
}

O (para fanáticos de una sola línea):

int[] z = (from arrays in new[] { a, b, c } from arr in arrays select arr).ToArray();

Aunque el último método es mucho más elegante, el primero definitivamente es mejor para el rendimiento.

Para obtener información adicional, consulte esta publicación en mi blog.

Darkseal
fuente
0

Para int [] lo que has hecho me parece bien. La respuesta de Astander también funcionaría bien List<int>.

mezoide
fuente
2
Concat también funcionaría para List <int>. Eso es lo bueno de Concat, funciona en cualquier IEnumerable <>
Mike Two
0

Para matrices más pequeñas <10000 elementos:

using System.Linq;

int firstArray = {5,4,2};
int secondArray = {3,2,1};

int[] result = firstArray.ToList().Concat(secondArray.ToList()).toArray();
Michail Michailidis
fuente
¿Por qué usar Linq cuando no es necesario?
en
0
static class Extensions
{
    public static T[] Concat<T>(this T[] array1, params T[] array2) => ConcatArray(array1, array2);

    public static T[] ConcatArray<T>(params T[][] arrays)
    {
        int l, i;

        for (l = i = 0; i < arrays.Length; l += arrays[i].Length, i++);

        var a = new T[l];

        for (l = i = 0; i < arrays.Length; l += arrays[i].Length, i++)
            arrays[i].CopyTo(a, l);

        return a;
    }
}

Creo que la solución anterior es más general y más ligera que las otras que vi aquí. Es más general porque no limita la concatenación para solo dos matrices y es más ligero porque no usa LINQ ni List.

Tenga en cuenta que la solución es concisa y la generalidad agregada no agrega una sobrecarga de tiempo de ejecución significativa.

drowa
fuente
Recomiendo tratar de encontrar nuevas preguntas o preguntas que no tengan muchas respuestas, incluida una muy parecida a la suya.
Andrew Barber
Propuse esta solución porque creo que resume lo que es bueno de los otros. Fue hecho a mano.
Drowa
-2

int [] x = nuevo int [] {1, 2, 3}; int [] y = new int [] {4, 5};

int [] z = x.Union (y) .ToArray ();

Milad Doraki
fuente
2
Unionno es una muy buena forma de hacerlo, ya que llama Distincty elimina implícitamente cualquier duplicado de la colección unida. Concates mucho mejor, pero ya está en la pregunta original.
nurchi
-3
int[] scores = { 100, 90, 90, 80, 75, 60 };
int[] alice = { 50, 65, 77, 90, 102 };
int[] scoreBoard = new int[scores.Length + alice.Length];

int j = 0;
for (int i=0;i<(scores.Length+alice.Length);i++)  // to combine two arrays
{
    if(i<scores.Length)
    {
        scoreBoard[i] = scores[i];
    }
    else
    {
        scoreBoard[i] = alice[j];
        j = j + 1;

    }
}


for (int l = 0; l < (scores.Length + alice.Length); l++)
{
    Console.WriteLine(scoreBoard[l]);
}
presty prajna
fuente