Como faço para construir uma impressora conteúdo C # matriz genérica que aceita ambos os objetos e primitivos?
Pergunta
Eu só estou tentando depurar rapidamente um webservice imprimindo o conteúdo de um array int e string. Existe uma maneira de fazer isso em um método?
Eu tentei
public static string ArrayToString(object[] array)
{
StringBuilder sb = new StringBuilder();
foreach (Object item in array)
{
sb.Append(item.ToString());
sb.Append(" ");
}
return sb.ToString();
}
Mas este engasga quando eu tento e enviá-lo uma matriz primitiva (int []) devido ao facto de não ser um objeto.
O que eu acho estranho como o envio de um int para o método abaixo funciona
static void PrintObject(object obj)
{
Console.WriteLine(obj.ToString());
}
Existe uma maneira de fazer isso em um método ou estou apenas vai ter para o homem e criar dois métodos distintos?
É claro que se eu deveria estar usando matrizes em tudo é questionável, mas o serviço web já está em vigor.
Veja também:
Solução
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();
}
Em seguida
int[] x = new int[] { 1, 2, 3 };
string[] y = new string[] { "a", "b", "c" };
Console.WriteLine(ArrayToString(x));
Console.WriteLine(ArrayToString(y));
Outras dicas
Tente algo parecido com isto:
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();
}
O compilador feliz inferir o tipo de T
pelo tipo de lista você passar como esta:
toString(new int[] { 1, 2, 3 });
toString(new String[] { "1", "2", "3" });
Por que você escolheu um array? Seu código depende de nenhuma das propriedades específicas de uma matriz e, em vez apenas vê uma lista de objetos. Parece que IEnumerable seria uma escolha muito melhor e permitiria praticamente qualquer coleção de objetos
public static string ArrayToString(IEnumerable source)
{
StringBuilder sb = new StringBuilder();
foreach (Object item in source)
{
sb.Append(item.ToString());
sb.Append(" ");
}
return sb.ToString();
}
private string PrintObjects<T>(IEnumerable<T> objs)
{
return string.Join(" ", objs.Select(o => o.ToString()).ToArray());
}
Existem algumas maneiras de fazer isso.
Se você tem Linq, você poderia fazer
int[] foo = new int[] {1,2,3,4};
ArrayToString(foo.Cast<Object>().ToArray());
e, em seguida, enviá-lo.
Ou, você poderia fazer um método de extensão genérica
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();
}