Usar otra mecánica diferente a la que se hizo en la pregunta no es una respuesta.
user11909
@ user2190035: No estoy seguro de dónde sacaste esa idea, y las 111 personas que votaron no estarían de acuerdo contigo. Si conoce una mejor manera de expandir una matriz, publíquela por todos los medios. Sin embargo, dudo que su reasignación y copia manual sean mejores que usar una Lista. A veces la respuesta es "no hagas eso".
Ed S.
@ EdS. La pregunta era cómo agregar un elemento a una matriz de cadenas existente , pero esta respuesta no tiene ninguna matriz, sino que crea una nueva Lista <>. En mi aplicación, no puedo cambiar el tipo a Lista <>, por lo tanto, tengo que cambiar el tamaño de una matriz (hacer una copia ...). La respuesta de Ali Ersöz me ayudó.
user11909
@ user2190035: IEnumerable <T> .ToArray (). Escribo C # todos los días y nunca he tenido que cambiar el tamaño de una matriz como esa.
@Konrad, eso seguramente preservará los datos en la matriz.
Ali Ersöz
1
Esto no es adecuado para invocar más de unas pocas veces. porque la función 'Cambiar tamaño' tiene un gran rendimiento. error por una o dos veces, esto es muy bueno.
Me gusta usar esto, ya que es de una sola línea y muy conveniente para incrustar en una declaración de cambio, una simple declaración if o pasar como argumento.
EDITAR:
A algunas personas no les gusta new[] { newitem }porque crea una pequeña matriz temporal de un solo elemento. Aquí hay una versión Enumerable.Repeatque no requiere la creación de ningún objeto (al menos no en la superficie; los iteradores de .NET probablemente crean un montón de objetos de máquina de estado debajo de la tabla).
Tenga en cuenta que si desea agregar elementos a una colección ordenada, Listprobablemente sea la estructura de datos que desea, no una matriz para comenzar.
Muy agradable +1. Tengo un código similar como un método de extensión genérico. He incluido el código en esta respuesta: stackoverflow.com/a/11035286/673545
dblood
Esto es muy útil al encontrar "cómo agregar a una matriz en una línea de código en c #". Esperemos que este comentario sea suficiente para encontrarlo nuevamente la próxima vez.
Gary
28
Pregunta muy antigua, pero todavía quería agregar esto.
Si está buscando una línea, puede usar el siguiente código. Combina el constructor de la lista que acepta una sintaxis de inicializador enumerable y la "nueva" (desde la pregunta planteada).
Como puede ver, crea una nueva matriz con el nuevo tamaño, copia el contenido de la matriz de origen y establece la referencia a la nueva matriz. La sugerencia para esto es la palabra clave ref para el primer parámetro.
Hay listas que pueden asignar dinámicamente nuevos espacios para nuevos elementos. Esto es, por ejemplo, Lista <T> . Estos contienen matrices inmutables y los redimensionan cuando es necesario (¡List <T> no es una implementación de lista vinculada!). ArrayList es lo mismo sin Generics (con Object array).
LinkedList <T> es una implementación real de la lista vinculada. Desafortunadamente, puede agregar solo elementos LinkListNode <T> a la lista, por lo que debe ajustar sus propios elementos de lista en este tipo de nodo. Creo que su uso es poco común.
Puede ampliar la respuesta proporcionada por @Stephen Chung utilizando su lógica basada en LINQ para crear un método de extensión utilizando un tipo genérico.
publicstaticclassCollectionHelper{publicstaticIEnumerable<T>Add<T>(thisIEnumerable<T> sequence, T item){return(sequence ??Enumerable.Empty<T>()).Concat(new[]{ item });}publicstatic T[]AddRangeToArray<T>(this T[] sequence, T[] items){return(sequence ??Enumerable.Empty<T>()).Concat(items).ToArray();}publicstatic T[]AddToArray<T>(this T[] sequence, T item){returnAdd(sequence, item).ToArray();}}
Luego puede llamarlo directamente en la matriz de esta manera.
publicvoidAddToArray(string[] options){// Add one item
options = options.AddToArray("New Item");// Add a
options = options.AddRangeToArray(newstring[]{"one","two","three"});// Do stuff...}
Es cierto que el método AddRangeToArray () parece un poco exagerado ya que tiene la misma funcionalidad con Concat (), pero de esta manera el código final puede "funcionar" directamente con la matriz en lugar de esto:
Todas las respuestas propuestas hacen lo mismo que dicen que les gustaría evitar, crean una nueva matriz y agregan una nueva entrada solo con la pérdida de más sobrecarga. LINQ no es mágico, la lista de T es una matriz con un espacio de búfer con algo de espacio adicional para evitar cambiar el tamaño de la matriz interna cuando se agregan elementos.
Todas las abstracciones tienen que resolver el mismo problema, crear una matriz sin espacios vacíos que contengan todos los valores y los devuelvan.
Si necesita la flexibilidad y puede crear una lista lo suficientemente grande que puede usar para pasar, hágalo. de lo contrario, use una matriz y comparta ese objeto seguro para subprocesos. Además, el nuevo Span ayuda a compartir datos sin tener que copiar las listas.
string[] sourceArray =new[]{"foo","bar"}string additionalItem ="foobar";string result = sourceArray.Union(additionalItem);
Tenga en cuenta que esto imita este comportamiento de la extensión Uniion de Linq (utilizada para combinar dos matrices en una nueva), y requiere la biblioteca Linq para funcionar.
Estoy de acuerdo con Ed. C # no lo hace tan fácil como lo hace VB con ReDim Preserve. Sin una colección, tendrá que copiar la matriz en una más grande.
Desafortunadamente, usar una lista no funcionará en todas las situaciones. Una lista y una matriz son realmente diferentes y no son 100% intercambiables. Dependería de las circunstancias si esto fuera una solución aceptable.
Eso podría ser una solución;
Pero para una matriz de tamaño dinámico, también preferiría la lista.
fuente
Usando LINQ:
Me gusta usar esto, ya que es de una sola línea y muy conveniente para incrustar en una declaración de cambio, una simple declaración if o pasar como argumento.
EDITAR:
A algunas personas no les gusta
new[] { newitem }
porque crea una pequeña matriz temporal de un solo elemento. Aquí hay una versiónEnumerable.Repeat
que no requiere la creación de ningún objeto (al menos no en la superficie; los iteradores de .NET probablemente crean un montón de objetos de máquina de estado debajo de la tabla).Y si está seguro de que la matriz nunca
null
comenzará, puede simplificarla para:Tenga en cuenta que si desea agregar elementos a una colección ordenada,
List
probablemente sea la estructura de datos que desea, no una matriz para comenzar.fuente
Pregunta muy antigua, pero todavía quería agregar esto.
Si está buscando una línea, puede usar el siguiente código. Combina el constructor de la lista que acepta una sintaxis de inicializador enumerable y la "nueva" (desde la pregunta planteada).
fuente
Las matrices en C # son inmutables , por ejemplo
string[]
,int[]
. Eso significa que no puede cambiar su tamaño. Necesita crear una nueva gama.Aquí está el código para Array.Resize :
Como puede ver, crea una nueva matriz con el nuevo tamaño, copia el contenido de la matriz de origen y establece la referencia a la nueva matriz. La sugerencia para esto es la palabra clave ref para el primer parámetro.
Hay listas que pueden asignar dinámicamente nuevos espacios para nuevos elementos. Esto es, por ejemplo, Lista <T> . Estos contienen matrices inmutables y los redimensionan cuando es necesario (¡List <T> no es una implementación de lista vinculada!). ArrayList es lo mismo sin Generics (con Object array).
LinkedList <T> es una implementación real de la lista vinculada. Desafortunadamente, puede agregar solo elementos LinkListNode <T> a la lista, por lo que debe ajustar sus propios elementos de lista en este tipo de nodo. Creo que su uso es poco común.
fuente
Aray.Resize
puede cambiar el tamaño de una matriz sin perder su contenido. docs.microsoft.com/en-us/dotnet/api/…fuente
Puede ampliar la respuesta proporcionada por @Stephen Chung utilizando su lógica basada en LINQ para crear un método de extensión utilizando un tipo genérico.
Luego puede llamarlo directamente en la matriz de esta manera.
Es cierto que el método AddRangeToArray () parece un poco exagerado ya que tiene la misma funcionalidad con Concat (), pero de esta manera el código final puede "funcionar" directamente con la matriz en lugar de esto:
fuente
Es mejor mantener la matriz inmutable y de tamaño fijo.
puedes simular
Add
porExtension Method
yIEnumerable.Concat()
fuente
si está trabajando mucho con matrices y no con listas por alguna razón, este método genérico de devolución con tipo genérico
Add
podría ayudarlofuente
Todas las respuestas propuestas hacen lo mismo que dicen que les gustaría evitar, crean una nueva matriz y agregan una nueva entrada solo con la pérdida de más sobrecarga. LINQ no es mágico, la lista de T es una matriz con un espacio de búfer con algo de espacio adicional para evitar cambiar el tamaño de la matriz interna cuando se agregan elementos.
Todas las abstracciones tienen que resolver el mismo problema, crear una matriz sin espacios vacíos que contengan todos los valores y los devuelvan.
Si necesita la flexibilidad y puede crear una lista lo suficientemente grande que puede usar para pasar, hágalo. de lo contrario, use una matriz y comparta ese objeto seguro para subprocesos. Además, el nuevo Span ayuda a compartir datos sin tener que copiar las listas.
Para responder la pregunta:
fuente
Entonces, si tiene una matriz existente, mi solución rápida será
Ahora solo reemplace la matriz original con la nueva
fuente
Se
Append<TSource>
ha agregado un nuevo métodoIEnumerable<TSource>
desde .NET Framework 4.7.1 y .NET Core 1.0.Aquí está cómo usarlo:
Tenga en cuenta que si desea agregar el elemento al comienzo de la matriz, puede utilizar el nuevo
Prepend<TSource>
método.fuente
Usar una lista sería su mejor opción para administrar la memoria.
fuente
¿Qué pasa con el uso de un método de extensión? Por ejemplo:
por ejemplo:
Tenga en cuenta que esto imita este comportamiento de la extensión Uniion de Linq (utilizada para combinar dos matrices en una nueva), y requiere la biblioteca Linq para funcionar.
fuente
Estoy de acuerdo con Ed. C # no lo hace tan fácil como lo hace VB con ReDim Preserve. Sin una colección, tendrá que copiar la matriz en una más grande.
fuente
ReDim Preserve
simplemente copia la matriz en una lager. No hay cambio milagroso de matriz.fuente
fuente
¿Por qué no probar usando la clase Stringbuilder ? Tiene métodos como .insert y .append. Puede leer más sobre esto aquí: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
fuente
Desafortunadamente, usar una lista no funcionará en todas las situaciones. Una lista y una matriz son realmente diferentes y no son 100% intercambiables. Dependería de las circunstancias si esto fuera una solución aceptable.
fuente
Dado que esta pregunta no está satisfecha con la respuesta proporcionada, me gustaría agregar esta respuesta :)
fuente