Как создать универсальный принтер содержимого массива C#, который принимает как объекты, так и примитивы?
Вопрос
Я просто пытаюсь быстро отладить веб-сервис, распечатав содержимое массива int и строк.Можно ли это сделать одним методом?
Я пытался
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());
}
Можно ли как-нибудь сделать это одним методом или мне просто придется собраться и создать два отдельных метода?
Конечно, вопрос о том, следует ли мне вообще использовать массивы, но веб-сервис уже существует.
Смотрите также:
Решение
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));
Другие советы
Попробуйте что-то вроде этого:
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" });
Почему вы выбрали массив?Ваш код не зависит ни от одного из конкретных свойств массива, а просто видит список объектов.Кажется, что 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();
}
private string PrintObjects<T>(IEnumerable<T> objs)
{
return string.Join(" ", objs.Select(o => o.ToString()).ToArray());
}
Есть несколько способов сделать это.
Если у вас есть 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();
}