【问题标题】:Why am I getting different results? [duplicate]为什么我得到不同的结果? [复制]
【发布时间】:2021-06-26 04:32:05
【问题描述】:
string s = "this is a test";
var result = s.ToCharArray().Reverse();
result.ToString();                               
Console.Write(result.ToArray()); //output = test a si sith  
but with code : Console.WriteLine(result.ToString().ToArray());

还有代码:

result.ToString(); 
result.ToArray(); 
Console.Write(result);

输出是:

System.Linq.Enumerable+ReverseIterator`1[System.Char]

【问题讨论】:

  • 这就是 ToString() 在未被覆盖时所做的;它只显示对象的运行时类型的名称。见重复。您的第一个示例运行良好,因为有Write() method overload 接受ToArray() 返回的char[]。请注意,在该示例中,您没有在要打印的内容上调用 ToString(),而在第二个示例中,在第三个示例中,Write() 方法隐式调用 ToString()

标签: c#


【解决方案1】:

在你的情况下,

var result = s.ToCharArray().Reverse(); //Here type of result is IEnumerable<char>
result.ToString();//Calls default implementation of `.ToString()` method                           

当您调用ToString() 时,它会从覆盖的ToString() 函数返回结果字符串。如果它没有在给定的类中实现,那么它返回它的基本实现,它返回变量的完全限定名。

在您的情况下,.ToString() 函数在 Enumerable 类中未被覆盖,因此它返回 system.linq.Enumerable+ReverseIterator1[System.Char],因为它是 result 变量的完全限定名称。

如果你想打印result的元素,那么试试string.Join(),比如

var result = s.ToCharArray().Reverse();
Console.WriteLine(string.Join("", result));  //Instead of result.ToString()

MSDN 文档:Object.ToString Method

Object.ToString 是 .NET Framework 中的主要格式化方法。 它将一个对象转换为它的字符串表示,以便它是 适合展示。 (有关格式支持的信息 .NET Framework,请参阅格式化类型。)默认实现 Object.ToString 方法返回完全限定名称 对象的类型。

【讨论】:

    【解决方案2】:

    有区别,因为行:

    result.ToString();
    

    根本不影响最终打印的内容。像这样调用ToString 会创建字符串

    "System.Linq.Enumerable+ReverseIterator`1[System.Char]"
    

    然后丢弃它。请注意,这不会以某种方式将该字符串重新分配给 result,正如您可能想的那样。

    所以你本质上是在比较:

    Console.Write(result.ToArray());
    

    Console.WriteLine(result.ToString().ToArray());
    

    请注意,result 是一个 IEnumerable&lt;char&gt;,包含字符串 s 中的字符序列,但相反。 result.ToString().ToArray() 表示“在result 上调用ToString,然后在ToString 的返回值上调用ToArray”。

    IEnumerable&lt;char&gt;(即result)上调用ToString 不会为您提供序列中的字符,而只是提供类型名称(这是默认的ToString 实现):

    System.Linq.Enumerable+ReverseIterator`1[System.Char]
    

    然后您在该字符串上调用ToArray 将其转换为char[],并且有an overload of Console.WriteLine 打印char[] 中的字符。

    Console.Write(result.ToArray()); 类似,只是你不将IEnumerable&lt;char&gt; 转换为不是很有用的字符串,而是直接将chars 的序列转换为char[],所以char[] 实际上有s 的字符倒序排列。

    Write 也有一个重载,可以打印 char[] 的内容,然后你调用它。

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2015-04-06
      • 2019-09-07
      相关资源
      最近更新 更多