我如何比较c#中的两个字符串并获得差异?
例如:
String1:我有一辆车
string2:我有一辆新车bmw
结果:new,bmw
答案 0 :(得分:26)
你需要确保较大的集合位于Except
的左侧(不确定是否有纯Linq方式来实现这一点):
static void Main(string[] args)
{
string s1 = "i have a car a car";
string s2 = "i have a new car bmw";
List<string> diff;
IEnumerable<string> set1 = s1.Split(' ').Distinct();
IEnumerable<string> set2 = s2.Split(' ').Distinct();
if (set2.Count() > set1.Count())
{
diff = set2.Except(set1).ToList();
}
else
{
diff = set1.Except(set2).ToList();
}
}
答案 1 :(得分:8)
基于你的问题(这有点模糊。)这应该有效。
var first = string1.Split(' ');
var second = string2.Split(' ');
var primary = first.Length > second.Length ? first : second;
var secondary = primary == second ? first : second;
var difference = primary.Except(secondary).ToArray();
在文件顶部,请确保包含:
using System.Linq;
答案 2 :(得分:6)
您可以使用差异算法执行此任务。论文“An O(ND) Difference Algorithm and Its Variations”描述了一种非常强大的算法来完成这项任务。对于C#中的实现,您可以查看“An O(ND) Difference Algorithm for C#”,但是恕我直言,如果您对算法的工作方式感兴趣,请查看本文并自行实现详细。
答案 3 :(得分:0)
我有一些空字符串的空点异常,所以我改进了 Mitch Wheat 的答案来处理这个问题:
public static string Difference(string str1, string str2)
{
if (str1 == null)
{
return str2;
}
if (str2 == null)
{
return str1;
}
List<string> set1 = str1.Split(' ').Distinct().ToList();
List<string> set2 = str2.Split(' ').Distinct().ToList();
var diff = set2.Count() > set1.Count() ? set2.Except(set1).ToList() : set1.Except(set2).ToList();
return string.Join("", diff);
}