问题是:
"编写一个程序,从文本中提取所有回文单词,例如 ABBA"、"lamal"、"exe"。 "
这是我的代码:
public static List<string> FindPalindromes()
{
string text = String.Empty;
Console.Write("Enter the text:\n\t");
text = Console.ReadLine();
List<string> answer = new List<string>();
string[] words = text.Split('.', ',', ' ', ':', '/', '\\', '"', ';');
foreach(string word in words.Where(
(string x) =>
{
if(String.Equals(x, x.Reverse()))
return true;
else
return false;
}
))
answer.Add(word);
return answer;
}
现在我认为,如果我将 where 方法中的逻辑分离到一个返回 bool 值并检查单个单词是否为回文的单独方法中,它会更整洁。但我想尝试使用 lambda。
无论如何,这段代码不会返回任何东西。我怀疑问题出在 if 条件上。
最佳答案
x.Reverse()
正在调用 Enumerable.Reverse()
,这将返回一个 IEnumerable<char>
- 不是 字符串。这就是为什么 Equals
永远不会回来 true
.这是一个替代方案:
char[] chars = x.ToCharArray();
Array.Reverse(chars);
return x == new string(chars);
或者您可以直接调用 string.Join
或 string.Concat
在相反的字符序列上 - 效率极低,但它会在一个表达式中完成工作,允许您替换 foreach
中的所有内容之后:
return words.Where(x => x == string.Concat(x.Reverse())
.ToList();
更简洁 :) 每当您发现自己反复添加到列表中时,请考虑使用查询和 ToList()
.你已经有了过滤部分,你只需要使用 ToList()
摆脱 foreach
循环。
同样,任何时候你发现自己:
if (condition)
return true;
else
return false;
...强烈考虑重构为:
return condition;
关于c# - 如何用 lambda 解决这个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685765/