C#实现文本行对比:逐行匹配text1与text2并提取共同内容
C#实现双文本共同行提取的代码方案
本次实现严格对齐需求逻辑:拆分两个输入文本为独立行集合后,交叉比对筛选两边共有的行内容,可完全复现测试场景的匹配结果——输入text1行集合为#John、#Gary、#Smith,text2行集合为#Adam、#James、#Gary时,最终输出匹配结果#Gary。
逐行遍历版本(完全匹配需求描述的比对流程)
该版本严格按照“将text1的每一行与text2的所有行逐一匹配”的逻辑实现,没有引入额外的索引结构,完全对应需求描述的原生比对过程:
using System; using System.Collections.Generic; using System.Linq; public class CommonLineMatcher { public static List<string> ExtractCommonLines(string text1, string text2) { // 按不同换行符拆分文本,自动过滤空行 var linesOfText1 = text1.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Select(content => content.Trim()) .ToList(); var linesOfText2 = text2.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Select(content => content.Trim()) .ToList(); var commonResult = new List<string>(); // 逐行取text1的内容,和text2的所有行逐一比对 foreach (var lineFromText1 in linesOfText1) { // 跳过已经匹配过的行,避免结果重复 if (commonResult.Contains(lineFromText1)) continue; foreach (var lineFromText2 in linesOfText2) { // 全字符串精确匹配,区分大小写 if (lineFromText1.Equals(lineFromText2, StringComparison.Ordinal)) { commonResult.Add(lineFromText1); break; } } } return commonResult; } // 内置测试用例验证 public static void Main() { string testText1 = @"#John #Gary #Smith"; string testText2 = @"#Adam #James #Gary"; var matchResult = ExtractCommonLines(testText1, testText2); // 控制台输出:#Gary Console.WriteLine(string.Join(Environment.NewLine, matchResult)); } }
大文本性能优化版本
当两个文本的行数规模较大时,双重遍历的O(n*m)时间复杂度会出现明显性能损耗。可以通过提前将text2的行存入哈希集合的方式,把行匹配的查询效率从线性扫描降到常数级,整体时间复杂度优化为O(n+m),适配十万行以上的大文本场景:
public static List<string> ExtractCommonLinesFast(string text1, string text2) { var linesOfText1 = text1.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Select(content => content.Trim()); // 提前将text2的行存入HashSet,匹配速度大幅提升 var text2LineSet = new HashSet<string>( text2.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Select(content => content.Trim()) ); // 去重后筛选两边共有的行 return linesOfText1.Distinct() .Where(line => text2LineSet.Contains(line)) .ToList(); }
实现可调参数说明
- 匹配规则:默认采用区分大小写的精确匹配,如需忽略大小写,可在字符串比对逻辑中传入
StringComparison.OrdinalIgnoreCase参数,或初始化HashSet时传入对应的字符串比较器 - 空白处理:代码默认对每行首尾的不可见空白做裁剪,避免因行首行尾多打了空格导致匹配失败;如果需要严格匹配原始行内容,删除行处理逻辑中的
Trim()调用即可 - 结果去重:默认对输出的共同行做全局去重,避免同一行在某一文本中多次出现时反复输出;如需保留重复匹配项,移除
Distinct()调用即可
内容的提问来源于stack exchange,提问作者user15519784
相关产品推荐
相关产品推荐

