2012-04-04 58 views
2

我正在試圖找到一個比下面的代碼更優雅的方式來獲取基於其中一個包含單詞的索引的句子列表。例如,如果我給它一個單詞列表,例如用戶名,它會找到所有這些單詞的索引(這已經完成,並且是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

是什麼'GetWordsMatches'做什麼呢? – rikitikitik 2012-04-04 00:57:17

+0

它爲列表中的單詞所在的位置提供匹配MatchCollection。 – SpectralEdge 2012-04-04 02:19:59

回答

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(); 
    } 
+0

那很漂亮。謝謝你,它完美的作品。 – SpectralEdge 2012-04-04 12:06:12

4

就快...

  • 可以使用LastIndexOf(str, index)從向後一些位置搜索,

  • 爲「終止條件」應我猜只是在「.」添加一個if搜索(如果達到最終它會返回「-1」),

...無論如何,它可能是更好的牛逼o分割文件內容(使用.作爲分隔符),這樣你就不會遇到最後一個問題,因爲它會提取最後一行。然後搜索詞(在每行中,IndexOf與當前index)。或者我可能會使用枚舉器(w/yield return)擴展方法並行執行所有操作 - 並返回IEnumerable,以便您可以更「功能化」,向查詢中添加其他內容。

希望這有助於

+0

我對接收的文件沒有太多控制權。但是,我猜如果它缺少一個字符串的話,我可以在字符串的末尾打一段時間。我會看看LastIndexOf是否可以工作。 – SpectralEdge 2012-04-04 02:21:47

+0

你endInd只是得到'-1',處理它,並給它沒有長度的子字符串(或者使用'filecontent.Length -tmpind')。此外**錯誤**,[子字符串](http://msdn.microsoft.com/en-us/library/aka44szs.aspx)需要'長度'而不是索引(第二個參數)。你可以添加一個'.',僅僅是TrimEnd,用於空格,線條(和點) - 但是正確地修復它會更容易一些:)。 – NSGaga 2012-04-04 11:38:53