2

我有生成List<string[]>变量的代码,但无法弄清楚如何让它正确显示在文本框中。

List<string[]> test = parseCSV();
for (int i = 0;  i < test.Count; i++)
{
  Console.WriteLine("i = {0}",i);
  Console.WriteLine("test[i] = {0}", test[i]);
  nameList.Text = test[i].ToString() + "\n" + nameList.Text;
}

当我输出test[i]到控制台时,它会正确显示字符串信息,但是当我输出test[i]到文本框时,我得到:

System.String[]
System.String[]
System.String[]
System.String[]
System.String[]
System.String[]

谁能告诉我我做错了什么?

4

4 回答 4

5

这是一种常见的误解,ToString它出现在各种情况下。它不是一个神奇的格式化向导,即使原始类型看起来“如您所愿”。ToString 只是提供手头数据的合理表示。

在数组数据的情况下,.Net 为每个 ToString 调用(调试器大量使用)输出整个数组是令人讨厌的并且可能不正确。想象一个 60x60x10 的 3D 字符串数组。我不想仅仅因为我将鼠标放在调试器中的一个数组上而不得不等待它被渲染。

在这种情况下,您可以使用String.Join

for (int i = 0;  i < test.Count; i++)
{
    Console.WriteLine("i = {0}",i);
    Console.WriteLine("test[i] = {0}", test[i]);
    nameList.Text = String.Join(", ", test[i]) + "\n" + nameList.Text;
}
于 2012-07-02T16:44:18.637 回答
4

test[i]是一个字符串数组。数组不会覆盖ToString(),因此您只是获得了默认实现,它显示了对象的类型(System.String[]在这种情况下)。

目前还不清楚你用它做什么。例如,您可以使用:

Console.WriteLine("test[i] = {0}", string.Join(", ", test[i]));

...从数组中的所有字符串创建一个逗号分隔的字符串。

编辑:请注意:

Console.WriteLine("test[i] = {0}", test[i]);

实际上是从每个字符串数组中打印出第一个字符串。它使用数组协方差string[]object[]. 为了更清楚地执行相同的操作,您可以使用:

Console.WriteLine("test[i] = {0}", test[i][0]);

因此,如果您只想将每个数组中的第一个值放入文本框中,您可以使用:

nameList.Text = test[i][0] + "\r\n" + nameList.Text;

(请注意,这将有效地颠倒“行”的顺序。)我已更改\n为,\r\n因为这就是 Windows 上用于换行的文本框。)

于 2012-07-02T16:44:29.083 回答
1

您正在列表中存储字符串数组。正确的代码是:

foreach (string[] items in test)
   foreach (string item in items)
   {
       ...
   }

这将遍历列表中的所有数组,然后遍历当前数组中的所有项。

于 2012-07-02T16:45:14.720 回答
0

你在 test[i] 上使用 ToString() 方法。ToString() 请像这样使用它 test[i]

对于您的知识, Object.ToString() 返回代表当前对象的字符串。

因此你得到

System.String[]
System.String[]
System.String[]
System.String[]
System.String[]
System.String[]
于 2012-07-02T16:47:33.627 回答