Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq搜索-显示搜索文本的一小部分_Linq_Search_Text_Replace - Fatal编程技术网

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

Linq搜索-显示搜索文本的一小部分,linq,search,text,replace,Linq,Search,Text,Replace,我正在尝试用linq实现文本搜索。我有一个消息表,其中填充了电子邮件数据。我希望能够在邮件正文中搜索。但是,电子邮件正文非常长,我只想显示搜索文本的一小部分,例如,如果我搜索: aute 在以下案文中: 知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡 结果应该是: …从一个普通消费者那里买到的。两个孩子都有一个共同的愿望,一个共同的愿望,一

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

aute

在以下案文中:

知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡

结果应该是:

…从一个普通消费者那里买到的。两个孩子都有一个共同的愿望,一个共同的愿望,一个共同的愿望,一个共同的愿望,一个共同的愿望,一个共同的愿望,一个共同的愿望


谢谢

像这样的东西应该可以完成这项工作:

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,它描述了您要在要查找的字符串前后输入的字符数。请注意,此代码将只返回每个电子邮件中的第一个匹配项,而忽略其他匹配项

如果您可以使用helper函数来计算适当的子字符串tho,那么一切都会变得更容易

您可以找到一个扩展方法,该方法实现了string.substring的安全版本,使上述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));
    }

将查询作为IEnumerable

我计算出来了。谢谢你的帮助。
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));