¿Existe una función integrada en .NET 2.0 que tomará dos matrices y las fusionará en una sola?
Las matrices son del mismo tipo. Estoy obteniendo estas matrices de una función ampliamente utilizada dentro de mi base de código y no puedo modificar la función para devolver los datos en un formato diferente.
Estoy buscando evitar escribir mi propia función para lograr esto si es posible.
Array.Resize
realidad no cambia el tamaño de la matriz, la copia. Es por eso que el primer parámetro es by-ref (lo que significa que su primer código probablemente no se compilará).En C # 3.0 puede usar el método Concat de LINQ para lograr esto fácilmente:
En C # 2.0 no tiene una forma tan directa, pero Array.Copy es probablemente la mejor solución:
Esto podría usarse fácilmente para implementar su propia versión de
Concat
.fuente
Use LINQ :
Tenga en cuenta que esto eliminará los duplicados. Si desea mantener duplicados, use Concat.
fuente
Si no desea eliminar duplicados, intente esto
Use LINQ:
fuente
Primero, asegúrese de hacerse la pregunta "¿Realmente debería usar una matriz aquí"?
A menos que esté construyendo algo donde la velocidad sea de suma importancia, una lista con mecanografía, como,
List<int>
es probablemente el camino a seguir. La única vez que uso matrices es para matrices de bytes cuando envío cosas a través de la red. Aparte de eso, nunca los toco.fuente
List<T>
en API públicas: blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspxMás fácil sería usar LINQ :
Primero convierta los arreglos en listas y combínelos ... Después de eso, simplemente convierta la lista nuevamente en un arreglo :)
fuente
Creo que puedes usar Array.Copy para esto. Toma un índice de origen y un índice de destino, por lo que debería poder agregar una matriz a la otra. Si necesita ser más complejo que simplemente agregar uno al otro, esta puede no ser la herramienta adecuada para usted.
fuente
Asumiendo que la matriz de destino tiene suficiente espacio,
Array.Copy()
funcionará. También puede intentar usar ayList<T>
su.AddRange()
método.fuente
Personalmente, prefiero mis propias extensiones de idioma, que agrego o elimino a voluntad para la creación rápida de prototipos.
El siguiente es un ejemplo de cadenas.
Es mucho más rápido que LINQ y Concat. Aún más rápido, está utilizando un
IEnumerable
envoltorio de tipo personalizado que almacena referencias / punteros de matrices pasadas y permite recorrer toda la colección como si fuera una matriz normal. (Útil en HPC, Procesamiento de gráficos, Procesamiento de gráficos ...)Tu codigo:
Para ver el código completo y una versión genérica, consulte: https://gist.github.com/lsauer/7919764
Nota: Esto devuelve un objeto IEnumerable no extendido. Devolver un objeto extendido es un poco más lento.
Compilé tales extensiones desde 2002, con muchos créditos destinados a personas útiles en CodeProject y 'Stackoverflow'. Lo lanzaré en breve y pondré el enlace aquí.
fuente
Todos ya han dado su opinión, pero creo que esto es más legible que el enfoque de "usar como método de extensión":
Sin embargo, solo se puede usar cuando se unen 2 matrices.
fuente
Esto es lo que se me ocurrió. Funciona para un número variable de matrices.
...
fuente
Solo para tenerlo como una opción: si las matrices con las que está trabajando son de un tipo primitivo: booleano (bool), Char, SByte, Byte, Int16 (corto), UInt16, Int32 (int), UInt32, Int64 (long ), UInt64, IntPtr, UIntPtr, Single o Double, entonces podría (o debería) intentar usar Buffer.BlockCopy . Según la página de MSDN para la clase Buffer :
Usando el ejemplo C # 2.0 de la respuesta de @ OwenP como punto de partida, funcionaría de la siguiente manera:
Apenas hay alguna diferencia en la sintaxis entre
Buffer.BlockCopy
y laArray.Copy
que usó @OwenP, pero esto debería ser más rápido (aunque solo sea un poco).fuente
En caso de que alguien más esté buscando cómo fusionar dos conjuntos de bytes de imagen:
fuente
Aquí hay un ejemplo simple usando Array.CopyTo. Creo que responde a su pregunta y da un ejemplo del uso de CopyTo: siempre estoy confundido cuando necesito usar esta función porque la ayuda es un poco confusa: el índice es la posición en la matriz de destino donde se realiza la inserción.
Supongo que no puedes hacerlo mucho más simple.
fuente
Necesitaba una solución para combinar un número desconocido de matrices.
Sorprendido, nadie más proporcionó una solución
SelectMany
conparams
.Si no desea elementos distintos, simplemente elimine distintos.
Nota: Definitivamente no hay garantía de ordenar cuando se utiliza distinto.
fuente
Supongo que está utilizando sus propios tipos de matriz en lugar de las matrices .NET integradas:
Otra forma de hacerlo sería utilizar la clase integrada ArrayList.
Ambos ejemplos son C #.
fuente
Usando el código anterior, dos matrices se pueden combinar fácilmente.
fuente
Creado y método de extensión para manejar nulo
fuente
Si tiene las matrices de origen en una matriz en sí misma, puede usar SelectMany :
da
Probablemente este no sea el método más rápido, pero podría ajustarse dependiendo del caso de uso.
fuente
Este código funcionará para todos los casos:
fuente
Prueba esto:
fuente