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 []
risposta
Come utilizzare LINQ?
string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
È 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.
È solo array e potrebbe contenere effettivamente tipi di valore (probabilmente lo sarà). – KrisTrip
@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'? –
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
È possibile utilizzare Array.ConvertAll
, in questo modo:
string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString);
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));
Ancora un array di oggetti generici. –
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));
Senza conoscere i tipi fino alla fase di esecuzione, è essenzialmente necessario iterare l'array (sia con LINQ o qualsiasi metodo). – GrayWizardx
(risposto al commento) –