2009-05-13 7 views
0

J'essaie juste de déboguer rapidement un webservice en imprimant le contenu d'un tableau int et string. Y a-t-il de toute façon à le faire en une seule méthode?Comment créer une imprimante de contenu de tableau C# générique acceptant les objets et les primitives?

J'ai essayé

public static string ArrayToString(object[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (Object item in array) 
    { 
     sb.Append(item.ToString()); 
     sb.Append(" "); 
    } 

    return sb.ToString(); 
} 

Mais cette selfs quand je tente de l'envoyer un tableau primative (int []) en raison de ce pas être un objet.

Ce que je trouve étrange que l'envoi d'un int à la méthode ci-dessous fonctionne

static void PrintObject(object obj) 
{ 
    Console.WriteLine(obj.ToString()); 
} 

Y at-il de toute façon de le faire dans une méthode ou suis-je juste avoir à l'homme et créer deux méthodes distinctes? Bien sûr, le fait que je devrais utiliser des tableaux est discutable, mais le service Web est déjà en place.

Voir aussi:

Répondre

4
public static string ArrayToString<T>(T[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (T item in array) 
    { 
     sb.Append(item.ToString()); 
     sb.Append(" "); 
    } 

    return sb.ToString(); 
} 

Puis

int[] x = new int[] { 1, 2, 3 }; 

string[] y = new string[] { "a", "b", "c" }; 

Console.WriteLine(ArrayToString(x)); 
Console.WriteLine(ArrayToString(y)); 
+0

Je pense que cette solution me plaît le mieux, c'est une bonne utilisation des génériques. J'aurais dû y penser. –

1
private string PrintObjects<T>(IEnumerable<T> objs) 
{ 
    return string.Join(" ", objs.Select(o => o.ToString()).ToArray()); 
} 
4

Essayez quelque chose comme ceci:

static String toString<T>(IEnumerable<T> list) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (T item in list) 
    { 
     sb.Append(item.ToString()); 
     sb.Append(" "); 
    } 

    return sb.ToString(); 
} 

Le compilateur déduire heureusement le type de T par le type de la liste que vous passez comme ceci:

toString(new int[] { 1, 2, 3 }); 
toString(new String[] { "1", "2", "3" }); 
+0

Works, impressionnant. Je n'ai pas réalisé qu'un tableau primitif étendrait IList. Merci. –

+1

Vous pouvez tout aussi bien utiliser IEnumerable ou ICollection, puisque vous n'avez pas besoin de changer la liste ou d'accéder aux éléments par index (les vertus distinctives primaires de IList.) – mquander

+0

@mquander, pourriez-vous expliquer ce point un peu plus loin? –

2

Pourquoi avez-vous choisi un tableau? Votre code ne dépend d'aucune des propriétés spécifiques d'un tableau et ne voit qu'une liste d'objets. Il semble que IEnumerable serait un bien meilleur choix et permettrait pratiquement toute collection d'objets

public static string ArrayToString(IEnumerable source) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (Object item in source) 
    { 
     sb.Append(item.ToString()); 
     sb.Append(" "); 
    } 

    return sb.ToString(); 
} 
+0

Je suis d'accord mais le service web est déjà en place et fonctionne bien. –

+1

Je pense que IEnumerable serait mieux car cela empêcherait toute boxe lorsque vous itérez la collection. –

1

Il y a quelques façons de le faire.

Si vous avez Linq, vous pourriez faire

int[] foo = new int[] {1,2,3,4}; 
ArrayToString(foo.Cast<Object>().ToArray()); 

puis envoyez-le.

Ou, vous pouvez faire une méthode d'extension générique

public static string ToString<T>(this IEnumerable<T> val) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach(var item in val) 
    { 
     sb.Append(item.ToString()); 
     sb.Append(" "); 
    } 
    return sb.ToString(); 
}