55 votes

objet au tableau de chaînes

Je suis en train de convertir un objet (est déclaré ici comme 'obj': l'objet est la matrice de, primitive) à un tableau de chaînes.

l'objet peut être n'importe quoi uint[], int16[], etc.

J'ai essayé de l'utiliser

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

Le problème survient lorsque j'essaie de lancer le type inconnu d'objet en objet[]. J'ai obtenu une erreur de casting.

Une tentative que j'ai faite, qui a échoué, a été à l'aide de

object[] arr = (object[])obj;

ou

IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;

J'ai vu des offres concernant le type de la valeur de référence et le type de question sur le casting.

Y aurait-il un code simple qui peut gérer un casting pour objet[] quel que soit le type d'objet, tant que c'est un tableau ? Je suis en essayant d'éviter la manutention manuelle de chaque type de casting.

merci d'avance

85voto

Jon Skeet Points 692016

Vous pouvez utiliser le fait que chaque tableau implémente IEnumerable :

 string[] arr = ((IEnumerable)obj).Cast<object>()
                                 .Select(x => x.ToString())
                                 .ToArray();
 

Cela encadrera les primitives de manière appropriée, avant de les convertir en chaînes.

La raison pour laquelle la conversion échoue est que, bien que les tableaux de types de référence soient covariants, les tableaux de types valeur ne le sont pas:

 object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails
 

La diffusion à seulement IEnumerable fonctionnera cependant. Heck, vous pouvez lancer vers Array si vous le souhaitez.

17voto

JaredPar Points 333733

Si c'est toujours une collection d'un certain type (tableau, liste, etc ...), essayez de revenir à l'ancien System.Collections.IEnumerable et recommencez à partir de là

 string[] str = ((System.Collections.IEnumerable)obj)
  .Cast<object>()
  .Select(x => x.ToString())
  .ToArray();
 

Voici une implémentation plus approfondie qui gère également les non-collections

 static string[] ToStringArray(object arg) {
  var collection = arg as System.Collections.IEnumerable;
  if (collection != null) {
    return collection
      .Cast<object>()
      .Select(x => x.ToString())
      .ToArray();
  }

  if (arg == null) {
    return new string[] { };
  }

  return new string[] { arg.ToString() };
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X