2

我试图找到一种比下面的代码更优雅的方法来获取基于其中一个包含单词的索引的句子列表。因此,例如,如果我给它一个单词列表,例如用户名,它会找到所有这些单词的索引(这已经完成并且是 GetWordsMatches 方法)然后,使用该单词的索引,我想抓住整个句子。

我有两个问题,一,我不知道如何在单词之前查看到上一期,只是结尾一,二,如果最后一个单词匹配没有a,我不知道如何阻止它崩溃文件结束前的时间段。

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

有没有更优雅的方法来做到这一点?

4

2 回答 2

5

只要快...

  • 您可以使用LastIndexOf(str, index)从某个位置向后搜索,

  • 对于“结束条件”,我猜你应该if在“ .”搜索中添加一个(如果它到达末尾,它会返回“ -1”),

...无论如何,拆分文件内容(作为分隔符)可能会更好.,这样你就不会遇到最后一个问题,因为它会拿起最后一行。然后搜索单词(在每一行中,IndexOf使用 current index)。或者我可能会使用 enumerator (w/ yield return) 扩展方法并行执行所有这些操作 - 并返回 IEnumerable 以便您可以更“实用”,向查询中添加其他内容。

希望这可以帮助

于 2012-04-04T00:57:58.533 回答
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();
    }
于 2012-04-04T02:44:30.200 回答