Вывод уникальных значений массива C#

Ваша программа так же получает на вход два числа в строковом формате, но теперь они могут быть разной длины. Найдите все уникальные элементы первого числа (значения, которые встречаются только 1 раз в обоих массивах)
Пример:
12335
1458
В данном случае уникально число 2 - оно существует в одном экземпляре 1 и 5 есть во втором массиве, а 3 встречается дважды в первом
В итоге ответ:
"Уникально число 2".

я написал следующий код

using System;
using System.Collections.Generic;
using System.Linq;
public class MainClass
{
    public static void Main()
    {
        string num1 = Console.ReadLine();
        string num2 = Console.ReadLine();
        string allnum = num1 + num2;
        var diff = allnum.Except(num2);
        foreach (var s in diff)
            Console.WriteLine($"Уникально число {s} ");
    }
}

Как убрать из ответа повторяющиеся значения, так как они не будут являться уникальными?


Ответы (3 шт):

Автор решения: InterceptorTSK
namespace UniqueChars_v0
{
    public sealed class UniqueChars
    {
        public readonly int[] CharCounters;

        public UniqueChars(string firstString, string secondString)
        {
            CharCounters = new int[128];

            // if (firstString is not null)
            if (!object.ReferenceEquals(firstString, null))
            {
                for (int i = 0; i < firstString.Length; i++)
                    CharCounters[firstString[i]]++;

                // if (secondString is not null)
                if (!object.ReferenceEquals(secondString, null))
                    for (int i = 0; i < secondString.Length; i++)
                        if (CharCounters[secondString[i]] > 0)
                            CharCounters[secondString[i]]++;
            }
        }
        [CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
        public bool HasUniqueChar(int charIndex)
        {
            return CharCounters[charIndex] == 1;
        }
        [CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
        public bool HasUniqueNumber(int charIndex)
        {
            return charIndex >= '0' && charIndex <= '9'
                && CharCounters[charIndex] == 1;
        }

        public sealed override string ToString()
        {
            var sb = new System.Text.StringBuilder("[ ");

            for (int i = 0; i < CharCounters.Length; i++)
                if (HasUniqueChar(i)) { sb.Append((char)i).Append(' '); }

            return sb.Append(']').ToString();
        }
        public string UniqueNumbersToString()
        {
            var sb = new System.Text.StringBuilder("[ ");

            for (int i = '0'; i <= '9'; i++)
                if (HasUniqueChar(i)) { sb.Append((char)i).Append(' '); }

            return sb.Append(']').ToString();
        }
    }
}

Usage and Tests

                                                               Output
var unique0 = new UniqueChars(null, null);
System.Console.WriteLine(unique0);                             [ ]

var unique1 = new UniqueChars("", "");
System.Console.WriteLine(unique1);                             [ ]

var unique2 = new UniqueChars("0", "0");
System.Console.WriteLine(unique2);                             [ ]

var unique3 = new UniqueChars("12345", "12345");
System.Console.WriteLine(unique3);                             [ ]

var unique4 = new UniqueChars("12335", "1458");
System.Console.WriteLine(unique4);                             [ 2 ]
System.Console.WriteLine(unique4.UniqueNumbersToString());     [ 2 ]
System.Console.WriteLine(unique4.HasUniqueNumber('1'));        False
System.Console.WriteLine(unique4.HasUniqueNumber('2'));        True

var unique5 = new UniqueChars("Hello", "World");
System.Console.WriteLine(unique5);                             [ H e ]
System.Console.WriteLine(unique5.HasUniqueChar('e'));          True
System.Console.WriteLine(unique5.HasUniqueNumber('e'));        False

var unique6 = new UniqueChars("Ticket 12335", "Ticket 1458");
System.Console.WriteLine(unique6);                             [ 2 ]

var unique7 = new UniqueChars("tICKET 12335", "Ticket 1458");
System.Console.WriteLine(unique7);                             [ 2 C E I K ]
System.Console.WriteLine(unique7.UniqueNumbersToString());     [ 2 ]
→ Ссылка
Автор решения: Mark Shcerbakov

Кол-во символов в строке можно проверить, деля строку методом Split(), по размеру Length полученного массива разделенных частей исходной строки. Если символ делит строку на более чем две части, то соответственно таких символов в строке несколько. Один символ делит строку на две части.

string.Concat(num1.Except(num2).Where(c => num1.Split(c).Length == 2));
→ Ссылка
Автор решения: pasha goroshko

Строка это массив символов, поэтому для того чтобы использовать Except правильно, вы можете ваши строки преобразовать сперва в массивы и получить вашу заветную разницу. upd. Удаляем дубликаты из первой строки Пример кода

    var items1 = "12335".Select(x=> x).GroupBy(x=> x).Where(x=> x.Count() == 1).Select( x=> x.Key);
    var items2 = "1458".Select(x=> x);
    
    foreach(var c in items1.Except(items2))
        Console.WriteLine(c);
→ Ссылка