Как создать общий принтер содержимого массива C #, который принимает как объекты, так и примитивы? - PullRequest
0 голосов
/ 13 мая 2009

Я просто пытаюсь быстро отладить веб-сервис, распечатывая содержимое массива int и string. Есть ли способ сделать это одним способом?

Я пытался

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

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

    return sb.ToString();
}

Но это задыхается, когда я пытаюсь отправить ему массив примитивов (int []) из-за того, что он не является объектом.

Что я нахожу странным, так как отправка int в метод ниже работает

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

В любом случае, можно ли это сделать одним методом или мне просто нужно разобраться и создать два отдельных метода?


Конечно, стоит ли мне вообще использовать массивы, сомнительно, но веб-сервис уже работает.

Смотри также:

Ответы [ 5 ]

4 голосов
/ 13 мая 2009
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();
}

Тогда

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

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

Console.WriteLine(ArrayToString(x));
Console.WriteLine(ArrayToString(y));
4 голосов
/ 13 мая 2009

Попробуйте что-то вроде этого:

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

Компилятор с радостью выведет тип T по типу списка, который вы передаете следующим образом:

toString(new int[] { 1, 2, 3 });
toString(new String[] { "1", "2", "3" });
2 голосов
/ 13 мая 2009

Почему вы выбрали массив? Ваш код не зависит ни от каких конкретных свойств массива, а просто видит список объектов. Кажется, что IEnumerable был бы намного лучшим выбором и позволял бы фактически любую коллекцию объектов

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

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

    return sb.ToString();
}
1 голос
/ 13 мая 2009

Есть несколько способов сделать это.

Если у вас есть Linq, вы можете сделать

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

, а затем отправьте его.

Или вы можете сделать общий метод расширения

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();
}
1 голос
/ 13 мая 2009
private string PrintObjects<T>(IEnumerable<T> objs)
{
    return string.Join(" ", objs.Select(o => o.ToString()).ToArray());
}
...