比较两个字符串并获得差异

时间:2010-07-27 13:03:21

标签: c#

我如何比较c#中的两个字符串并获得差异?

例如:

String1:我有一辆车

string2:我有一辆新车bmw

结果:new,bmw

4 个答案:

答案 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);
}