Linq搜索 - 显示搜索文本的一小部分

时间:2013-08-13 07:25:13

标签: linq search text replace

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

aute

在以下文字中:

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 repreptderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum。

结果应该是:

... aliquip ex ea commodo consequat。 Duis aute irure dolor in repreptderit in velptate velit esse cillum dolore eu fugiat nulla pariatur ....

由于

1 个答案:

答案 0 :(得分: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,用于描述您要查找的字符串之前和之后要使用的字符数。请注意,此代码仅返回每封电子邮件中的第一个匹配项,而忽略其他电子邮件。

如果您可以使用辅助函数来计算正确的子字符串,那么一切都会更容易。

Here你可以找到一个实现string.substring安全版本的扩展方法,使得linq代码上面的hte看起来像:

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