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

C#中实现单词级字符串对比并区分单词归属的实现方案求助

C#中实现单词级字符串对比并区分单词归属的实现方案求助

嗨,我来帮你解决这个问题!你的核心需求是把两个字符串的差异单词按归属分组展示,而不是简单列出所有差异,其实只需要分别提取两个字符串独有的单词集合,再格式化输出就可以了,我给你两种实用的实现方式:

方式一:忽略大小写对比(保留原单词格式)

如果你的场景不需要严格区分单词大小写(比如Cat和cat算同一个单词),可以用这个方案,它会保留原单词的大小写输出,同时对比时不区分大小写:

string str1 = "Cat meet's a dog has";
string str2 = "Cat meet's a dog and a bird";

// 用HashSet存储单词,指定忽略大小写的比较器,方便快速查找
var str1WordSet = new HashSet<string>(str1.Split(' ', StringSplitOptions.RemoveEmptyEntries), StringComparer.OrdinalIgnoreCase);
var str2WordSet = new HashSet<string>(str2.Split(' ', StringSplitOptions.RemoveEmptyEntries), StringComparer.OrdinalIgnoreCase);

// 筛选只在第一个字符串里的单词,去重后拼接
var onlyInFirst = string.Join(" ", str1.Split(' ', StringSplitOptions.RemoveEmptyEntries)
    .Where(word => !str2WordSet.Contains(word))
    .Distinct(StringComparer.OrdinalIgnoreCase));

// 筛选只在第二个字符串里的单词,去重后拼接
var onlyInSecond = string.Join(" ", str2.Split(' ', StringSplitOptions.RemoveEmptyEntries)
    .Where(word => !str1WordSet.Contains(word))
    .Distinct(StringComparer.OrdinalIgnoreCase));

// 按要求格式输出(用-15做对齐,让输出更整齐)
if (!string.IsNullOrEmpty(onlyInFirst))
{
    Console.WriteLine($"{onlyInFirst,-15} - present in first string not present in second string");
}
if (!string.IsNullOrEmpty(onlyInSecond))
{
    Console.WriteLine($"{onlyInSecond,-15} - not present in first string but present in second string");
}

运行这段代码后,输出完全符合你的要求:

has             - present in first string not present in second string
and bird        - not present in first string but present in second string

(注:这里a在两个字符串中都存在,所以不会出现在差异里,这才是正确的结果,你之前的原代码里出现a是因为直接用Split后的数组对比,没有考虑重复单词的情况)

方式二:严格区分大小写对比

如果你的场景需要严格区分大小写(比如A和a算不同单词),只需要去掉HashSet的比较器参数即可:

var str1WordSet = new HashSet<string>(str1.Split(' ', StringSplitOptions.RemoveEmptyEntries));
var str2WordSet = new HashSet<string>(str2.Split(' ', StringSplitOptions.RemoveEmptyEntries));

其他代码保持不变,这样就会严格按照单词的大小写来判断是否为同一单词。

针对你的第二个测试用例

当输入是:

string S1 = "Added";
string S2 = "Edited";

用上面的代码会输出:

Added           - present in first string not present in second string
Edited          - not present in first string but present in second string

完美匹配你的期望。

额外优化点

  • 用StringSplitOptions.RemoveEmptyEntries可以避免拆分时产生空字符串(比如原字符串有连续空格、首尾空格的情况)
  • 如果你想保留原字符串中重复的差异单词(比如str1里多次出现has,想全部显示),只需要去掉代码中的.Distinct(...)部分即可

备注:内容来源于stack exchange,提问作者Niranjan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:18:06