0

linq でテキスト検索を実装しようとしています。メールデータが入力された Messages テーブルがあります。メッセージ本文を検索できるようにしたい。ただし、電子メールの本文は非常に長いため、検索したテキストのごく一部のみを表示したい場合は、たとえば次のように検索します。

オート

次のテキストで:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labe et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui office deserunt mollit anim id est labum.

結果は次のようになります。

...aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur....

ありがとう

4

1 に答える 1

1

このようなものが仕事をするはずです:

var query = from str in messages
  let index = str.IndexOf(search)
  where index > -1
  select str.Substring(Math.Max(0, index - radius), radius + Math.Min(radius, str.Length - index));

ここで、messages はメール文字列リスト、radius は探している文字列の前後の文字数を表す int です。このコードは、すべてのメールで最初に一致したもののみを返し、他のものは無視することに注意してください。

ヘルパー関数を使用して適切な部分文字列を計算できれば、すべてが簡単になります。

ここでは、string.substring の安全なバージョンを実装する拡張メソッドを見つけることができます。これにより、上記の linq コードは次のようになります。

var query = from str in lst
  let index = str.IndexOf(search)
  where index > -1
  select str.SafeSubstring(index - radius, 2*radius);

私の意見では、それは読むのがはるかに簡単です

編集

次の 2 つの方法で文字列を拡張します。

    public static List<int> IndexOfAll(this String str, string search)
    {
        List<int> lst = new List<int>();
        foreach (Match match in Regex.Matches(str,search))
        {
            lst.Add(match.Index);
        }
        return lst;
    }

    public static string SafeSubstring(this String str, int start, int n)
    {
        return str.Substring(Math.Max(start, 0), Math.Min(n, str.Length - start));
    }

を使用して、すべての結果を適切な形式で取得できます。

var query = from str in lst
  let index = str.IndexOfAll(search)
  where index.Count>0
  select index.Select(x => str.SafeSubstring(x-radius, 2*radius));

クエリを IEnumerable として使用

于 2013-08-13T09:26:22.473 に答える