You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 10:15:04