2009-12-28 4 views
39

J'ai un System.Array que j'ai besoin de convertir en chaîne []. Existe-t-il une meilleure façon de faire cela que simplement boucler dans le tableau, en appelant ToString sur chaque élément, et en enregistrant dans une chaîne []? Le problème est que je ne connais pas nécessairement le type des éléments avant l'exécution.Convertir System.Array en string []

+0

Sans connaître les types jusqu'à ce que l'exécution, vous devez essentiellement itérer sur le tableau (que ce soit avec LINQ ou toute autre méthode). – GrayWizardx

+0

(a répondu au commentaire) –

Répondre

61

Comment utiliser LINQ?

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

Je ne semble pas avoir accès à la méthode .Select de mon tableau. Est-ce que je manque quelque chose? – KrisTrip

+3

Oui, ajoutez 'System.Linq' à votre' using' –

+0

Assurez-vous que vous utilisez C# 3 et que vous avez inclus l'espace de noms System.Linq. – LBushkin

13

Est-ce juste Array? Ou est-ce (par exemple) object[]? Si oui:

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

Remarque que tout tableau 1-d de types de référence devraient être castées object[] (même si elle est en fait, par exemple, Foo[]), mais des types de valeur (tels que int[]) peut » t être. Donc, vous pouvez essayer:

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

Mais si elle est quelque chose comme int[], vous devrez boucle manuellement.

+0

Il s'agit juste d'un tableau et il pourrait contenir des types de valeurs (probablement). – KrisTrip

+0

@KrisTrip - la variable * peut être "juste Array", mais l'objet ne sera pas; il a un type de tableau défini. Il y a aussi une différence de ** gros ** entre "contain value types" (que object [] 'peut faire), et" est un tableau de type valeur "(comme' int [] ').Cette différence compte dans ce cas. Pouvez-vous clarifier ce que ** exactement ** l'instance de 'Array' est? –

+0

Je reçois le tableau en utilisant une méthode ToArray. Je ne sais pas jusqu'à l'exécution, mais il peut s'agir d'un int [], double [], float [], chaîne [] ou Complex [] (objet défini par l'utilisateur) – KrisTrip

4

Vous pouvez utiliser Array.ConvertAll, comme ceci:

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

Cela peut probablement être compressé, mais il contourne la limitation de ne pas être en mesure d'utiliser Cast <> ou Linq Sélectionnez un type de System.Array objet.

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

Encore un tableau d'objets génériques. –

0

Approche simple et simple;

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); 

Ou juste une autre approche: Vous pouvez utiliser personNames.ToArray aussi:

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