1

我正在尝试编写一个内联函数,以递归地使用 lambda 表达式计算字符串中单词的出现次数。

功能:

Func<string, string, int> getOccurrences = null;
getOccurrences = (text, searchTerm) =>
  text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) == -1
  ? 0
  : getOccurrences(
      text.Substring(
        text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase)
        + searchTerm.Length),
      searchTerm) + 1;

问题是我调用IndexOf了两次方法,第一个是递归中断条件,第二个是获取添加它的值。

有没有建议调用一次?

提前致谢。

4

5 回答 5

6

如果您不介意非纯函数 lambda,您可以这样做:-

Func<string, string, int> getOccurrences = null;
getOccurrences = (text, searchTerm) => 
{
   int i = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase);
   return i == -1 ? 0 : getOccurrences(i + searchTerm.Length), searchTerm) + 1;
}
于 2010-10-24T23:06:40.457 回答
0

我建议你把它作为一个单独的方法

   Func<string, string, int> getOccurrences = GetOccurrences;

   private int GetOccurrences(string text, string searchTerm)
   {
        //...    
   }

或内联

Func<string, string, int> getOccurrences = delegate(string text, string searchTerm)
                                           {
                                               //...
                                           };

使用 lambda 语法,但只是上面写法的另一种方式

Func<string, string, int> getOccurrences = (string text, string searchTerm) =>
                                           {
                                               //...
                                           };
于 2010-10-24T23:05:13.387 回答
0

你可以这样做:

Func<string, string, int> getOccurrences =
    (text, searchTerm) => getOccurrencesInternal(
        text,
        searchTerm,
        text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase));
Func<string, string, int, int> getOccurrencesInternal = null;
getOccurrences = (text, searchTerm, index) => 
  index == -1 
  ? 0 
  : getOccurrencesInternal( 
      text.Substring( 
        index + searchTerm.Length), 
      searchTerm) + 1; 
于 2010-10-24T23:23:04.043 回答
0

您可以使用额外的匿名 lambda 并立即调用它。我不确定确切的 C# 语法,但它应该类似于:

Func<string, string, int> getOccurrences = null;
getOccurrences = (text, searchTerm) =>
  ((index) =>
    index == -1
    ? 0
    : getOccurrences(text.Substring(index + searchTerm.Length),
        searchTerm) + 1
  )(text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase))
于 2010-10-25T04:32:23.170 回答
0

对于这类问题,我通常的解决方案是忽略任何优化,只是删除匹配项并检查结果字符串长度的任何变化。

Func<String, String, Int32> getOccurrences = (text, term) => 
    (text.Length - text.Replace(term, "").Length) / term.Length;
于 2010-10-25T04:33:02.310 回答