繁体   English   中英

有没有办法比较 C# 中的两个字符串并仅获取差异?

[英]Is there a way to compare two strings in C# and get the differences only?

我正在尝试比较 C# 中的两个字符串并获取它们之间的差异,即在另一个字符串中不存在的单词忽略大小写和逗号只关注单词。 如果一个字符串包含两个或多个the而第二个字符串包含一个the ,则意味着这将被忽略,因为它存在于两者中。 示例我有两个如下所示的字符串;

  1. 猫遇见狗
  2. 猫遇见一只狗和一只鸟

这两个字符串之间的区别是and bird因为它在第一个字符串中不存在,反之亦然,我想在列表或新字符串中获取这两个词and bird ,它们之间有空格,换句话说我想要其他字符串中不存在的单词。 有没有办法在 C# 中完成?

我给你写了一个简单的解决方案,希望它会有所帮助 -

主要方法称为“差异”,它接收 2 个字符串进行比较并返回一个称为 StringDiff 的 object。 它运行 2 个循环,首先在两个字符串之间逐个比较,然后添加较长字符串的 rest。

'StringDiff' object 是一个 class 具有 2 个字符列表,表示每个字符串的差异。

在主要方法中,我使用 String.join 将字符列表转换为字符串并打印出来。

  internal class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("enter first string");
                string firstString = Console.ReadLine();
                Console.WriteLine("enter second string");
                string secondString = Console.ReadLine();
                StringsDiff _stringsDiff = Difference(firstString, secondString);
                Console.WriteLine(
                $"fist string difference: {string.Join("", _stringsDiff._diffList1)} / second string difference: {string.Join("", _stringsDiff._diffList2)}");
                Console.WriteLine("/////////////////////////////////////");
            }
        }

        private static StringsDiff Difference(string firststring, string secondstring)
        {
            StringsDiff _stringsDiff = new StringsDiff();
            char[] _firstStringArray = firststring.ToCharArray();
            char[] _secondStringArray = secondstring.ToCharArray();
            int lenght;
            
            if (_firstStringArray.Length > _secondStringArray.Length)
            {
                lenght = _secondStringArray.Length;
                
                for (int i = 0; i < lenght; i++)
                {
                    if (!_firstStringArray[i].Equals(_secondStringArray[i]))
                    {
                        _stringsDiff._diffList1.Add(_firstStringArray[i]);
                        _stringsDiff._diffList2.Add(_secondStringArray[i]);
                    }
                }



                for (int i = _secondStringArray.Length; i < _firstStringArray.Length; i++)
                {
                    _stringsDiff._diffList1.Add(_firstStringArray[i]);
                }

            }
            else
            {
                lenght = _firstStringArray.Length;

                for (int i = 0; i < lenght; i++)
                {
                    if (!_firstStringArray[i].Equals(_secondStringArray[i]))
                    {
                        _stringsDiff._diffList1.Add(_firstStringArray[i]);
                        _stringsDiff._diffList2.Add(_secondStringArray[i]);
                    }
                }

                for (int i = _firstStringArray.Length; i < _secondStringArray.Length; i++)
                {
                    _stringsDiff._diffList2.Add(_secondStringArray[i]);
                }
            }

            return _stringsDiff;
        }

        class StringsDiff
        {
            public List<char> _diffList1 = new List<char>();
            public List<char> _diffList2 = new List<char>();
        }
    }

如果需要字符串,请记住使用“string.join”连接列表对象。

这是使用LINQ的方法。 您不需要“ToList()”部分,但您提到作为 output 的一种形式,您想要:

string str1 = "Cat meet's a dog";
string str2 = "Cat meet's a dog and a bird";
string[] str1Words = str1.ToLower().Split(' ');
string[] str2Words = str2.ToLower().Split(' ');
var uniqueWords = str2Words.Except(str1Words).Concat(str1Words.Except(str2Words)).ToList();

// Do whatever you want with uniqueWords instead
Console.WriteLine($"output: {String.Join(" ", uniqueWords)}");

@ngdeveloper。 这是我对您的解决方案的变体(由于长度原因,不得不将其发布在单独的答案中):

private static StringsDiff Difference(string firststring, string secondstring)
{
    StringsDiff _stringsDiff = new StringsDiff();
    char[] _firstStringArray = firststring.ToCharArray();
    char[] _secondStringArray = secondstring.ToCharArray();
    int shortestLenght;
    int longestLenght;
    bool firstIsLongest;

    if (_firstStringArray.Length > _secondStringArray.Length)
    {
        firstIsLongest = true;
        shortestLenght = _secondStringArray.Length;
        longestLenght = _firstStringArray.Length;
    }
    else
    {
        firstIsLongest = false;
        shortestLenght = _firstStringArray.Length;
        longestLenght = _secondStringArray.Length;
    }
    
    for (int i = 0; i < shortestLenght; i++)
    {
        if (!_firstStringArray[i].Equals(_secondStringArray[i]))
        {
            _stringsDiff._diffList1.Add(_firstStringArray[i]);
            _stringsDiff._diffList2.Add(_secondStringArray[i]);
        }
    }
    for (int i = shortestLenght; i < longestLenght; i++)
    {
        if (firstIsLongest)
            _stringsDiff._diffList1.Add(_firstStringArray[i]);
        else
            _stringsDiff._diffList2.Add(_secondStringArray[i]);
    }
    return _stringsDiff;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM