Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何构建同时接受对象和原语的通用C数组内容打印机?_C#_.net_Arrays_Tostring - Fatal编程技术网

C# 如何构建同时接受对象和原语的通用C数组内容打印机?

C# 如何构建同时接受对象和原语的通用C数组内容打印机?,c#,.net,arrays,tostring,C#,.net,Arrays,Tostring,我只是想通过打印int和string数组的内容来快速调试web服务。是否有一种方法可以做到这一点 我试过了 public static string ArrayToString(object[] array) { StringBuilder sb = new StringBuilder(); foreach (Object item in array) { sb.Append(item.ToString()); sb.Append(" "

我只是想通过打印int和string数组的内容来快速调试web服务。是否有一种方法可以做到这一点

我试过了

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

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

    return sb.ToString();
}
但当我尝试向它发送一个primative数组int[]时,由于它不是一个对象,这会阻塞

我觉得这很奇怪,因为向下面的方法发送int可以工作

static void PrintObject(object obj)
{
    Console.WriteLine(obj.ToString());
}
不管怎么说,是用一种方法来实现这一点,还是我只需要人工创建两种不同的方法

当然,我是否应该使用数组是有疑问的,但是web服务已经到位了

另见:


试着这样做:

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

有几种方法可以做到这一点

如果你有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();
}

真管用,太棒了。没有意识到基元数组会扩展IList。谢谢。您可以同样轻松地使用IEnumerable或ICollection,因为您不需要通过索引来更改列表或访问元素IList的主要区别优点。IEnumerable、ICollection和IList三个接口都实现了与数组或一般序列相关联的不同功能。IEnumerable是最简单的,它只定义了逐个获取每个元素的能力,即支持每个元素。ICollection是一个IEnumerable,它表示一个序列,该序列还附加了一个确定的长度,如果它不是只读的,您可以从中添加和删除内容。IList是一个按一定顺序排列的ICollection,因此它允许您按索引操作元素,就像您可以使用数组一样。有关更多信息,我建议您查看每个接口的MSDN文档,因为它们会准确地告诉您它们支持哪些方法,但这是Cliffs Notes版本。字典/哈希表是IEnumerable和ICollection的一个示例-它有元素计数,您可以添加和删除元素-但它不是IList,因为您不能要求哈希表的第一个元素。我同意,但web服务已经到位,并且运行良好。我认为IEnumerable会更好,因为这样可以防止在迭代集合时出现任何装箱。我认为我喜欢这个解决方案,因为它是泛型的最佳使用。我应该想到这一点。
int[] x = new int[] { 1, 2, 3 };

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

Console.WriteLine(ArrayToString(x));
Console.WriteLine(ArrayToString(y));
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();
}