首页 文章

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

提问于
浏览
0

我正在尝试用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 .

结果应该是:

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

谢谢

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

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

    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);
    

    在我看来,这是非常简单的阅读

    EDIT

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

    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

相关问题