2009-12-28 8 views
39

Possiedo un file System.Array che devo convertire in stringa []. Esiste un modo migliore per farlo rispetto al semplice ciclo della matrice, chiamando ToString su ciascun elemento e salvando su una stringa []? Il problema è che non conosco necessariamente il tipo di elementi fino al runtime.Converti System.Array in stringa []

+0

Senza conoscere i tipi fino alla fase di esecuzione, è essenzialmente necessario iterare l'array (sia con LINQ o qualsiasi metodo). – GrayWizardx

+0

(risposto al commento) –

risposta

61

Come utilizzare LINQ?

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

Sembra che non abbia accesso al metodo .Select dalla mia matrice. Mi sto perdendo qualcosa? – KrisTrip

+3

Sì, aggiungi 'System.Linq' al tuo 'using' –

+0

Assicurati di utilizzare C# 3 e di aver incluso lo spazio dei nomi System.Linq. – LBushkin

13

È solo Array? O è (per esempio) object[]? Se così:

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

nota di ogni matrice 1-d di riferimento tipi dovrebbe essere calcinabile per object[] (anche se in realtà è, per esempio, Foo[]), ma di valore tipo (ad esempio int[]) può' essere Così si potrebbe provare:

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

Ma se si tratta di qualcosa di simile int[], dovrete ciclo manualmente.

+0

È solo array e potrebbe contenere effettivamente tipi di valore (probabilmente lo sarà). – KrisTrip

+0

@KrisTrip - la * variabile * potrebbe essere "solo matrice", ma l'oggetto non lo sarà; ha un tipo di array definito. Esiste anche una ** grande ** differenza tra "contenere i tipi di valore" (cosa che l'oggetto [] 'può fare), e" è un array di tipo valore "(come ad esempio' int [] ').Questa differenza è importante in questo caso. Puoi chiarire cosa è ** esattamente ** l'istanza di 'Array'? –

+0

Ottengo l'array utilizzando un metodo ToArray. Non so fino al runtime ma potrebbe essere un int [], double [], float [], string [] o Complex [] (oggetto definito dall'utente) – KrisTrip

4

È possibile utilizzare Array.ConvertAll, in questo modo:

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

Questo probabilmente può essere compresso, ma ottiene intorno al limite di non essere in grado di utilizzare Cast <> o Linq Select su un tipo System.Array di oggetto.

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

Ancora un array di oggetti generici. –

0

approccio semplice e di base;

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 solo un altro approccio: è possibile utilizzare personNames.ToArray troppo:

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