使用LINQ搜索文件时如何按原文本顺序输出匹配的词条内容
问题原因
你当前的实现是按词条集合phrase的存储顺序逐个校验匹配,因此最终结果的顺序完全由词条在集合里的先后决定,和词条在原文中的出现顺序没有关联。
解决思路
对每个匹配成功的词条,额外记录它在原文中第一次出现的索引位置,所有匹配完成后按索引位置从小到大排序,就能得到和原文出现顺序一致的结果。
调整后代码示例
private static void GetFiles(DriveInfo disk) { string[] files = Directory.GetFiles(disk.Name); foreach(string file in files) { string reader = File.ReadAllText(file); // 存储匹配到的词条和对应的起始索引 List<(string MatchedPhrase, int StartIndex)> matchedResults = new List<(string, int)>(); for(int a = 0; a < phrase.Count;a++) { string currentPhrase = phrase[a]; int index = reader.IndexOf(currentPhrase); if(index != -1) { matchedResults.Add((currentPhrase, index)); } } // 按词条在原文中的起始位置升序排序 var sortedResults = matchedResults.OrderBy(x => x.StartIndex).Select(x => x.MatchedPhrase).ToList(); // 后续直接使用sortedResults即可获得顺序正确的匹配结果 } }
注意事项
- 如果存在一个词条在原文中多次出现的情况,上述逻辑会取第一次出现的位置排序,且每个词条只记录一次,和你现有逻辑的匹配规则一致。
- 若需要保留同一词条多次出现的记录,可循环调用
IndexOf查找所有出现位置,逐个存入结果集即可。 - 如果你使用的是不支持值元组的.NET Framework低版本,可自定义存储结构或者用
Dictionary<int, string>存储索引和词条的对应关系,再排序即可。
内容的提问来源于stack exchange,提问作者Apple One
相关产品推荐
相关产品推荐

