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
相关产品推荐
相关产品推荐

