0
 public List<char> Columns(String input)
    {
        char[] temp = input.ToCharArray();
        List<char> columns = new List<char>(input.Length);
        for (int i = 0; i < input.Length; i++)
        {
            if (other.Contains(temp[i]))
            {
                columns.Add((char)(i+1));
            }
        }
        return columns;
    }

我的目标是让这个方法返回一个列表。但是,当我用另一种方法输出内容时,我得到了 'System.Collections.Generic.List[char]

Console.WriteLine(ex.Columns(line));

那是我输出它的尝试。

4

4 回答 4

4

首先,让我们回答为什么会得到System.Collections.Generic.List[char].

您用来向控制台输出内容的方法是Console.WriteLine。如果您转到链接页面,您将看到该方法的许多重载,它们都采用不同类型的参数。让我们想想当你传递一个 type 的参数时使用的是哪一个List<char>

如果您仔细查看该列表,您会发现没有需要List<anything>. System.Object如您所知,在 .NET 中,每种类型 派生自System.Object. 当 C# 编译器试图选择一个方法重载时,它无法解析出确切的类型,它会返回寻找是一种关系。在我们的例子中,唯一匹配的重载是需要System.Object.

那么这个超载有什么作用呢?如果您阅读说明,您将很容易理解。

如果 value 为 null,则仅写入行终止符。否则,将调用 value 的 ToString 方法以生成其字符串表示形式,并将生成的字符串写入标准输出流。

好的,所以当你传递你的字符列表时,它会调用一个 ToString() 方法。让我们看一下List<T>. 当您单击“ToString”链接时,您将看到您最终进入System.Object.ToString()页面。这意味着 List 类型不会覆盖基本方法。那么Object.ToString()做什么呢?

ToString 方法的默认实现返回Object 类型的完全限定名称,如以下示例所示。

谜团已揭开!

当您编写时Console.WriteLine(ex.Columns(line));,编译器会调用调用传递参数的Console.WriteLine(Object)重载,它会打印类型的完全限定名称。Object.ToString()

有了这些知识,您就可以弄清楚要如何打印字符本身。例如,您可以通过Console.WriteLine(Char[])编写传递一个字符数组来调用重载Console.WriteLine(ex.Columns(line).ToArray());

于 2013-01-27T04:43:16.343 回答
0

不确定您要在这里完成什么。始终可以对字符串进行索引以获取特定字符。

那么为什么要引入一个List以及为什么有一个时髦的方法。做就是了:

s[i]
于 2013-01-27T04:17:53.777 回答
0

没有一个数组不会帮助你。要输出集合的内容,您需要遍历集合中的每个元素。

使用list.ToString()调用ToString()onList<T>调用标准对象 ToString 实现,即打印出类型的名称,这就是您所看到的。

您必须对其进行迭代并访问每个元素:

foreach(var item in list) {
    string s = item.ToString();
}
于 2013-01-27T04:19:18.833 回答
0

试试这个:

Console.WriteLine(new string(ex.Columns(line).ToArray()));
于 2013-01-27T04:20:56.967 回答