1

谁能告诉我为什么下面方法返回的字符串长度总是60?这是控制台应用程序中的 C# 方法。

static string Reverse(string stringToReverse)
{
    string s = stringToReverse.Reverse().ToString();
    return s;
}

作为招聘过程的一部分,我们要求面试候选人编写一种反转字符串的方法。这是我们得到的一个答案。长度问题让我们感到疑惑。

4

3 回答 3

4

问题是该方法根本行不通。它使用 LINQ 将其stringToReverse视为IEnumerable<char>相反的...但是调用返回的 byToString不会这里想要的。不要看长度——看字符串本身!(当然,对此的单个单元测试将证明这一点。)IEnumerable<char>Reverse()

对此的明显解决方法是:

return new string(stringToReverse.Reverse().ToArray());

...但是由于 Unicode 组合字符、代理对等,这实际上仍然不会做正确的事情。实际上正确地反转字符串会非常复杂......当然不是我希望在面试,但意识到这比你想象的要难,这将是一个好的开始。

于 2013-04-10T08:29:19.200 回答
2

因为结果:

stringToReverse.Reverse().ToString()

是:

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

而不是字符串的反转内容。这是因为被方法string视为一个,调用此集合将为您提供集合的字符串表示形式,而不是其内容。IEnumerable<char>Reverse()ToString()

于 2013-04-10T08:29:10.627 回答
0

你看过结果字符串吗?

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

您的候选人使用 LinQ Reverse 方法创建了一个枚举,但没有意识到无法通过调用 .ToString() 将 Enumerable 转换为字符串。

一种可能的方法是从 char 数组创建一个新字符串:

static string Reverse(string stringToReverse)
{
  return new string(stringToReverse.Reverse().ToArray());
}
于 2013-04-10T08:30:38.217 回答