簡體   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