类型转换出错

时间:2017-03-27 10:52:45

标签: c#

首先我想说抱歉,因为你们很容易提问,因为我是初学者,我正在尝试编写一个程序来接受字符串中的输入并将其反转为新字符串,所以我可以比较两者字符串与回文相同。

compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'

我有两个字符串单词和反向,当我尝试反转字符串时,它显示错误 reverse = word [lengthOfWord]; 无法隐式将char类型转换为字符串,为什么会这样?因为我从不在我的程序中使用char

4 个答案:

答案 0 :(得分:2)

您需要StringBuilder。你的数组边界检查也搞砸了。数组索引从0开始,word.Length - 1是最后一个索引:

string word , reverse = "";
Console.WriteLine("type any word to check if it palindrome or not");
word = Console.ReadLine();
int lengthOfWord, j;
StringBuilder sb = new StringBuilder();
lengthOfWord = word.Length - 1;
for (j = lengthOfWord; j >= 0; j--)
{
    sb.Append(word[j]);
}
reverse = sb.ToString();

您收到错误,因为word[j]是字符而不是字符串。字符串也是不可变的更好用StringBuilder。

答案 1 :(得分:1)

您还可以使用LINQ反转字符串:

var reverse = new string(word.ToCharArray().Reverse().ToArray());

如果你的东西是for循环,那么这将起作用:

var reverse = "";
for (int i = word.Length - 1; i >= 0; i--)
{
    reverse += word[i];
}

请注意您的代码之间的区别:
 reverse = word[lengthOfWord]reverse += word[i]的对比 前者每次分配最后一个字符,而后者将每个单独的字符添加到字符串中。

但在这种情况下,使用stringbuilder更有效:

var sb = new System.Text.StringBuilder();
for (int i = word.Length - 1; i >= 0; i--)
{
    sb.Append(word[i]);
}
var reverse = sb.ToString();

那是因为String是一个不可变对象。因此,每当修改字符串的内容时,它实际上会在内存中分配一个新字符串。如果做得很多,就像循环一样,效率不高。
但是通过使用StringBuilder,可以在不重复每次迭代的情况下更改对象的内容。

答案 2 :(得分:0)

您的变量字是StringString是一个Char数组。因为它是一个数组,你可以通过[index]来访问它,这就是你正在做的事情。因此,当您使用word[lengthOfWord]时,您将获得Char。并且Char无法隐式转换为String

但是当你想保留一个String时,你的逻辑根本不正确。

答案 3 :(得分:0)

使用字符串构建器:

    static void Main(string[] args)
    {
        string word = string.Empty; 
        string reverse = string.Empty;
        Console.WriteLine("type any word to check if it palindrome or not");
        word = Console.ReadLine();
        var sb = new StringBuilder();
        for (var i = word.Length - 1; i >= 0; i--)
        {
            var ch = word[i];
            sb.Append(word[i]);
        }
        reverse = sb.ToString();
        Console.WriteLine(word);
        Console.WriteLine(reverse);
        Console.ReadKey();
    }