0

我正在尝试使用 linq 实现文本搜索。我有一个 Messages 表,其中填充了电子邮件数据。我希望能够在消息正文中进行搜索。但是电子邮件正文很长,我只想显示搜索文本的一小部分,例如,如果我搜索:

在以下文本中:

Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore 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 officia deserunt mollit anim id est labourum。

结果应该是:

...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 的扩展方法,使 hte 上面的 linq 代码看起来像:

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

在我看来,阅读起来要简单得多

编辑

使用以下两种方法扩展字符串:

    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 回答