LINQ:检查字符串是否是回文?

时间:2011-02-22 16:03:34

标签: c# linq

我想使用Linq检查字符串是否是回文。

更新

我想使用反向功能。

5 个答案:

答案 0 :(得分:7)

var result = Enumerable
                .SequenceEqual(text.ToCharArray(), text.ToCharArray()
                .Reverse());

答案 1 :(得分:3)

用它来反转字符串

new string(Enumerable.Range(1, input.Length).Select(i => input[input.Length - i]).ToArray())

取自this question 你可以做点什么

public bool isStringPalindrome(String input){
    var reversed = new string(Enumerable.Range(1, input.Length).Select(i => input[input.Length - i]).ToArray());
    return String.Compare(input, reversed, true) == 0;
}

请注意,这不会考虑标点符号和间距问题。

答案 2 :(得分:2)

我发现有一个替代LINQ解决方案,不需要反转字符串。

bool IsPalindrome(string input)
{
    return
        Enumerable.Range(0, input.Length/2)
                    .Select(i => input[i] == input[input.Length - i - 1])
                    .All(b => b);
}

与所提出的其他解决方案一样,这假定完全回文匹配。它不会忽略空格,标点符号,套管等。

有趣的是,这个解决方案使用LINQ来实现我在原始答案中显示的相同算法。


原始答案:

我不知道你为什么要使用LINQ。在代码中执行它会更有效率,在我看来,如果你只是为它创建一个方法,那么可读性会更高。

您可以使用与用于反转字符串相同的逻辑:

public bool IsPalindrome(s)
{
    int i = 0;
    int j = s.Length-1;
    while (i > j)
    {
        if (s[i] != s[j])
            return false;
        ++i;
        --j;
    }
    return true;
}

答案 3 :(得分:1)

您可以使用IEnumerable<T>.SequenceEquals方法检查字符串是否为回文:

var textA = "ABBA".ToCharArray();
var textB = textA.Reverse();

bool isPalindrome = textA.SequenceEqual(textB);

答案 4 :(得分:1)

var testString = "racecar";
//Remove all spaces with a String.Replace if you don't want them counted
//testString = String.Replace(testString, " ", String.Empty);
//and convert to all-lowercase
//testString = testString.ToLowerInvariant();

var forwardArray = testString.ToCharArray();
var reverseArray = forwardArray.Reverse().ToArray();

var isPalindrome = Enumerable.SequenceEqual(forwardArray, reverseArray);

现在,这将以2N步骤执行。通过简单的更改,您可以将其降低到一半:

var testString = "racecar";
//Remove all spaces with a String.Replace if you don't want them counted
//testString = String.Replace(testString, " ", String.Empty);
//and convert to all-lowercase
//testString = testString.ToLowerInvariant();

//take only half the string (rounded down) each way
var length = testString.Length;
var forwardArray = testString.Take(length/2); 
var reverseArray = testString.Reverse().Take(length/2);

var isPalindrome = Enumerable.SequenceEqual(forwardArray, reverseArray);