2009-12-28 14 views
39

Tengo un System.Array que necesito convertir a string []. ¿Hay una mejor manera de hacer esto que simplemente recorrer el conjunto, llamar a ToString en cada elemento y guardarlo en una cadena []? El problema es que no necesariamente conozco el tipo de elementos hasta el tiempo de ejecución.Convertir System.Array a string []

+0

Sin conocer los tipos hasta el tiempo de ejecución, que esencialmente necesita para iterar sobre la matriz (ya sea con LINQ o cualquier otro método). – GrayWizardx

+0

(respondió al comentario) –

Respuesta

61

¿Qué le parece usar LINQ?

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray(); 
+0

Parece que no tengo acceso al método .Select de mi matriz. ¿Me estoy perdiendo de algo? – KrisTrip

+3

Sí, agregue 'System.Linq' a su' using' –

+0

Asegúrese de estar utilizando C# 3, y de que haya incluido el espacio de nombres System.Linq. – LBushkin

13

¿Es sólo Array? ¿O es (por ejemplo) object[]? Si es así:

object[] arr = ... 
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString); 

Nota que cualquier 1-d matriz de referencia de tipo debe ser moldeable para object[] (incluso si en realidad es, por ejemplo, Foo[]), pero el valor de tipo (tales como int[]) puede' t ser Lo que podría intentar:

Array a = ... 
object[] arr = (object[]) a; 
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString); 

Pero si se trata de algo así como int[], que tendrá que bucle manualmente.

+0

Es simplemente Array y podría contener tipos de valores (probablemente). – KrisTrip

+0

@KrisTrip - la * variable * podría ser "solo Array", pero el objeto no será; tiene un tipo de matriz definida. También hay una ** gran ** diferencia entre "contener tipos de valores" (que 'object []' puede hacer), y "es una matriz de tipo valor" (como 'int []').Esta diferencia importa en este caso. ¿Puedes aclarar qué ** exactamente ** es la instancia de 'Array'? –

+0

Obtengo la matriz usando el método ToArray. No sé hasta el tiempo de ejecución, pero podría ser un int [], double [], float [], string [], o Complex [] (objeto definido por el usuario) – KrisTrip

4

Puede utilizar Array.ConvertAll, así:

string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString); 
0

Esto probablemente puede ser comprimido, pero se hace en torno a la limitación de no poder utilizar Cast <> Seleccionar o LINQ en un tipo de System.array objeto.

Type myType = MethodToGetMyEnumType(); 
Array enumValuesArray = Enum.GetValues(myType); 
object[] objectValues new object[enumValuesArray.Length]; 
Array.Copy(enumValuesArray, objectValues, enumValuesArray.Length); 

var correctTypeIEnumerable = objectValues.Select(x => Convert.ChangeType(x, t)); 
+0

Aún una matriz de objetos genéricos. –

0

Enfoque simple y básico;

Array personNames = Array.CreateInstance(typeof (string), 3); 
// or Array personNames = new string[3]; 
personNames.SetValue("Ally", 0); 
personNames.SetValue("Eloise", 1); 
personNames.SetValue("John", 2); 

string[] names = (string[]) personNames; 
// or string[] names = personNames as string[] 

foreach (string name in names) 
    Console.WriteLine(name); 

O simplemente un otro enfoque: Se puede utilizar personNames.ToArray también:

string[] names = (string[]) personNames.ToArray(typeof (string));