2

我正在尝试打印分配给特定数组的数字数组。我选择数字的算法包括选择一个不重复的随机数并将其存储在数组中。

真的很简单,但我不知道为什么它会打印出这个错误。

int[] ticket1 = new int[4];
for (int i = 0; i < 4; i++)
{
    int temp = rand.Next(43);
    while (ticket1.Contains(temp)) 
    {
        temp = rand.Next(43);
    }
    ticket1[i] = temp;
}
Console.WriteLine("{0}{1}", item.PadRight(20), ticket1.ToString());//ticket1 produces System.Int32[] instead of 4 numbers.
//I have changed this line to:
//Console.WriteLine("{0}{1}", item.PadRight(20), string.Join(",", ticket1));
//And it still doesn't work. the error remains. (System.Int32[])

我的问题是,如何以字符串格式打印出我的 4 个数字(彼此并排)。

//编辑:我发现了我的问题。我将ticket1 放在foreach 循环中,它以某种方式无法访问数组值,因此它打印出 System.Int32[] 。

都修好了。

4

4 回答 4

4

如果您调用ToString()这样的数组,您只需获得类类型的全名。

你可以用几种方法来修复它。仅打印循环内的当前项目,或在循环外一次打印每个项目:

Console.WriteLine("{0}{1}", item.PadRight(20), ticket1[0]);
Console.WriteLine("{0}{1}", item.PadRight(20), ticket1[1]);
// etc...

或在打印前“展平”集合:

Console.WriteLine("My numbers: ", String.Join(", ", ticket1));
于 2015-06-13T12:08:48.633 回答
4

ticket1.ToString()不打印数组的内容,只打印它的类型,因为这是ToString()在数组上实现方法的方式。

您可以通过多种方式解决此问题 - 例如,通过使用string.Join方法:

Console.WriteLine("{0}{1}", item.PadRight(20), string.Join(",", ticket1));
于 2015-06-13T12:08:54.653 回答
2

因为您不是在编写数组元素,而是在编写数组本身,这就是ToString()生成它的完整类型名称的原因。

在你的循环中改变你ticket1.ToString()的。ticket1[i]for

for (int i = 0; i < 4; i++)
{
     int temp = rand.Next(43);
     while (ticket1.Contains(temp))
     {
         temp = rand.Next(43);
     }
     ticket1[i] = temp;
     Console.WriteLine("{0} {1}", item.PadRight(20), ticket1[i]);
}

如果您不想在for循环中打印它,那么您可以使用String.Join将数组中的所有元素连接成一个简单的字符串,例如;

for (int i = 0; i < 4; i++)
{
     int temp = rand.Next(43);
     while (ticket1.Contains(temp))
     {
         temp = rand.Next(43);
     }
     ticket1[i] = temp;
}
Console.WriteLine("{0} {1}", item.PadRight(20), string.Join(",", ticket1));
于 2015-06-13T12:08:22.287 回答
1

因为当你调用.ToString()一个对象时,你会得到那个对象的类型。对于基本的原始(值)类型,此行为被覆盖以输出值。但是对于像数组这样的东西,没有“默认”字符串表示,所以你看到的行为是默认的。

您可以将数据包装在一个对象中并覆盖.ToString()该对象。如果您必须在代码中的许多地方输出值,那么您只需编写一次逻辑即可。(“智能数据结构和愚蠢的代码比其他方式工作得更好。” - Eric Raymond)

但是如果你只需要在这里做,那么你可以直接输出值。基本上以您想要的任何表示形式将值作为字符串加入。例如,如果它们应该用逗号分隔:

Console.WriteLine(
  "{0}{1}",
  item.PadRight(20),
  string.Join(",", ticket1));
于 2015-06-13T12:11:31.840 回答