1

ラムダ式を再帰的に使用して、文字列内の単語の出現回数をカウントするインライン関数を作成しようとしています。

関数:

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;

問題は、メソッドを 2 回呼び出していることですIndexOf。1 回目は再帰的なブレーク条件用で、2 回目はそれを追加するための値を取得するためのものです。

一度呼び出すことをお勧めしますか?

前もって感謝します。

4

5 に答える 5

6

非純粋関数ラムダを気にしない場合は、次のことができます:-

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

追加の匿名ラムダを使用して、すぐに呼び出すことができます。正確な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 に答える
0

別の方法にすることをお勧めします

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

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

またはインライン

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

ラムダ構文を使用しますが、上記の別の書き方です

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 に答える