我想使用Linq检查字符串是否是回文。
更新
我想使用反向功能。
答案 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);