Como faço para construir uma impressora conteúdo C # matriz genérica que aceita ambos os objetos e primitivos?

StackOverflow https://stackoverflow.com/questions/857976

  •  21-08-2019
  •  | 
  •  

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:

Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top