我试图找到比下面的代码更优雅的方式来获得基于其中一个包含单词的索引的句子列表。因此,例如,如果我给它一个单词列表,例如用户名,它会找到所有这些单词的索引(这已经完成并且是GetWordsMatches方法)然后,使用该单词的索引,我想要抓住整个句子。
我有两个问题,一个,我无法弄清楚如何在前一个时期之前看到这个词,只是结束一个,两个,我无法弄清楚如果最后一个单词匹配的话会阻止它崩溃在文件结束之前没有句号。
public static List<string> GetSentencesFromWords(List<string> Words, string FileContents)
{
List<string> returnList = new List<string>();
MatchCollection mColl = GetWordsMatches(Words,FileContents);
foreach (Match ma in mColl)
{
int tmpInd = ma.Index;
int endInd = FileContents.IndexOf(".", tmpInd);
string tmp = FileContents.Substring(tmpInd,endInd);
returnList.Add(tmp);
}
return returnList;
}
有更优雅的方法吗?
答案 0 :(得分:4)
快点......
您可以使用LastIndexOf(str, index)
从某个位置向后搜索,
对于“结束条件”,您应该猜测只需在“if
”搜索中添加一个.
(如果到达结尾,则会返回“-1
” ),
...无论如何,分割文件内容(用.
作为分隔符)可能会更好,这样你就不会有最后一个问题因为它拿起了最后一行。然后搜索单词(在每行中,IndexOf
使用当前index
)。或者我可能会使用枚举器(w / yield return
)扩展方法来并行执行所有操作 - 并返回IEnumerable以便您可以更“实用”,并在查询中添加其他内容。
希望这会有所帮助
答案 1 :(得分:2)
LINQ驱动的解决方案如何:
public static List<string> GetSentencesFromWords(List<string> words, string fileContents)
{
return fileContents.Split('.')
.Where(s => words.Any(w => s.IndexOf(w) != -1))
.Select(s => s.TrimStart(' ') + ".")
.ToList();
}