[我正在用C#执行回文检查,但我不知道为什么它不起作用

问题描述 投票:-2回答:2

我已经将整数转换为字符串并将其反转,但是在运行时。它总是返回错误的答案。

        var x = 121;
        var numba = x.ToString();
        char[] strArray = numba.ToCharArray();
        Array.Reverse(strArray);

        StringBuilder newString = new StringBuilder();
        StringBuilder newString2 = new StringBuilder();

        foreach(var item in strArray)
        {
            newString.Append(item);
        }

        foreach(var item in numba.ToCharArray())
        {
            newString2.Append(item);
        }        

        Console.WriteLine(newString);            
        Console.WriteLine(newString2);

        if(newString == newString2)
        {
            Console.WriteLine("true");
        }
        else 
        {
            Console.WriteLine("false");
        }

都是印刷121;但是,它不是返回true吗? StringBuilder有点这种情况吗?

c#
2个回答
0
投票

如果从以下位置替换if语句:

         if(newString == newString2)

至:

         if(newString.Equals(newString2))

您的问题将得到解决。

当在类型object的表达式上使用==时,它将解析为System.Object.ReferenceEquals。

Equals只是一个虚拟方法,其行为与此相同,因此将使用覆盖的版本(对于字符串类型,它比较内容)。

作为旁注,您还可以使用如下代码简化逻辑:

        var x = 121;
        var numStr = x.ToString();
        var numArray = numStr.ToCharArray();
        Array.Reverse(numArray);
        var revStr = new string(numArray);
        Console.WriteLine(numStr + "\n" + revStr);

        if(numStr.Equals(revStr))
        {
            Console.WriteLine("true");
        }
        else
        {
            Console.WriteLine("false");
        }

这可能不是最理想的代码,但是比您的方法更易于管理。


0
投票

这不是StringBuilder的“边缘情况”,它只是意味着StringBuilder类不会覆盖==运算符,因此您将获得两个对象之间的默认引用比较。

要比较它们表示的字符串,可以对在ToString()对象上调用StringBuilder的结果进行比较:

 if(newString.ToString() == newString2.ToString())

但是实际上,您似乎在这里做了很多额外的工作,要复制字符串,然后进行全面比较。相反,只需要简单地从两端到中间遍历字符串,就可以比较字符:

var x = 121;
var numba = x.ToString();

// Get the length of half the string
int halfLength = numba.Length / 2;

// Start assuming it is a palindrome
bool isPalindrome = true;

// Compare a character from the beginning of the string
// with it's corresponding character at the end. If the
// characters do not match, it's not a palindrome.
for (int i = 0; i < halfLength; i++)
{
    if (numba[i] != numba[numba.Length - i - 1])
    {
        // The characters don't match, it's not a palindrome
        isPalindrome = false;
        break;
    }
}

// Output the result
Console.WriteLine(isPalindrome);

-1
投票

检查回文的简单方法-

        static bool IsPlaindrome(string inputString)
        {
            if (string.IsNullOrEmpty(inputString))
                return false;

            var characters = inputString.ToCharArray();
            var stringLength = characters.Length;

            for (int i = 0; i < characters.Length/2; i++)
            {
                if (characters[i].Equals(characters[stringLength - 1 - i]))
                    continue;
                else
                    return false;
            }

            return true;
        }

用法

            var result = IsPlaindrome("asdffdsa");
© www.soinside.com 2019 - 2024. All rights reserved.