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?
Respuestas:
fuente
params
parámetros de número variable .System.IO.Directory.GetFiles()
devuelve una matriz de cadenas.Prueba esto:
fuente
List<int> list = new List<int>(x);
Podrías escribir un método de extensión:
Luego:
fuente
Copy
más rápido queCopyTo
? ¿Cuidado para elaborar?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:
Y uso:
fuente
params T[][]
athis T[][]
para que sea una extensión.Eso es todo:
fuente
int[] result = array1.ToList().Concat(array2.ToList()).toArray();
que no puede aplicar Concat en matrices directamente, creotoArray()
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to 'string[]'. An explicit conversion exists (are you missing a cast?)
int[] result = ?
, está ocultando el problema de su respuesta detrás de ustedvar
en que su resultado seráIEnumerable<int>
, noint[]
. (una de las razones por las que no me gustan lasvar
devoluciones de métodos).ToArray()
llamada, este código no devolverá una matriz real, por lo que también es una respuesta incorrecta.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.
fuente
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 ...
El resultado fue:
Tira tus propias victorias.
fuente
CopyTo
será la más rápida y ~ 3 veces más rápida queRoll your own
.Ten cuidado con el
Concat
método. La Concatenación de matriz posterior en C # explica que:Será ineficiente para grandes matrices. Eso significa que el
Concat
método es solo para matrices de tamaño mediano (hasta 10000 elementos).fuente
fuente
Más eficiente (más rápido) para utilizar
Buffer.BlockCopy
sobreArray.CopyTo
,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
Si modifico las matrices de prueba a dos secuencias de 0 a 99, obtengo resultados similares a este,
A partir de estos resultados, puedo afirmar que los métodos
CopyTo
yBlockCopy
son significativamente más eficientesConcat
y, además, si el rendimiento es un objetivo,BlockCopy
tiene 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.BlockCopy
ofrece alguna utilidad para la conversión de tipos más allá del alcance de esta pregunta.fuente
Respuesta tardía :-).
fuente
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.
fuente
Lamento revivir un hilo viejo, pero ¿qué tal esto?
Luego en tu código:
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 laforeach (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:
Entonces, en el código, puede hacer algo como:
El resto es igual que antes.
Otra mejora a esto sería cambiar
T[]
aIEnumerable<T>
(por lo queparams T[][]
se convertiría enparams IEnumerable<T>[]
) para hacer estas funciones aceptan más de matrices sólo.Espero que esto ayude.
fuente
Puede hacerlo de la forma en que se ha referido, o si desea obtener un manual realmente al respecto, puede rodar su propio bucle:
fuente
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:
Usando Lambda:
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.
fuente
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";)
fuente
Intenta lo siguiente:
fuente
Aquí está mi respuesta:
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:
Sin embargo, viene con dos advertencias que debe tener en cuenta:
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 posteriorToArray
negará dicha ventaja, ya que en realidad creará una nueva matriz y ocupará la memoria para el nueva matrizConcat
serí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:
O (para fanáticos de una sola línea):
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.
fuente
Para int [] lo que has hecho me parece bien. La respuesta de Astander también funcionaría bien
List<int>
.fuente
Para matrices más pequeñas <10000 elementos:
fuente
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.
fuente
int [] x = nuevo int [] {1, 2, 3}; int [] y = new int [] {4, 5};
int [] z = x.Union (y) .ToArray ();
fuente
Union
no es una muy buena forma de hacerlo, ya que llamaDistinct
y elimina implícitamente cualquier duplicado de la colección unida.Concat
es mucho mejor, pero ya está en la pregunta original.fuente