Сравнение русских и английский букв C#

106
14 августа 2019, 17:10

Есть набор символов, которые одинаково выглядят как на русском так и на английском языках (А,В,С,Е,Н,К,М,О,Р,Т,Х). Мне хотелось бы сравнивать эти буквы независимо от того, русские они или латинские. То есть например есть список с буквами вразнобой русские и английские и например хочу найти букву А в этом списке и мне бы показало букву А(русскую) и букву А(английскую). Как можно это реализовать?

Answer 1
var rus = new[] { 'Е', 'А', 'С' };
            var eng = new[] { 'E', 'A', 'C' };
            for (int i = 0; i < rus.Length; i++)
            {
                Console.WriteLine($"rus code - {(int)rus[i]} |  enf code {(int)eng[i]}");
            }
            Console.ReadKey();

rus code - 1045 |  enf code 69
rus code - 1040 |  enf code 65
rus code - 1057 |  enf code 67
Answer 2

Напишите свой StringComparer, реализующий такое сравнение, например:

public class TypefaceAwareComparer : StringComparer
{
    public static TypefaceAwareComparer Instance { get; } = new TypefaceAwareComparer();
    private readonly ILookup<char, char> similarChars;
    public TypefaceAwareComparer()
    {
        // Группы похожих символов разделены пробелами
        var symbols = "AА BВ CС EЕ HН Il1 KК MМ OО0 PР TТ XХ YУ aа cс eе nп oо pр uи xх yу 3З 6б";
        similarChars = symbols.Split()
            .SelectMany(s => s.SelectMany(c1 => s, (c1, c2) => (c1, c2)))
            .ToLookup(t => t.c1, t => t.c2);
    }
    public override int Compare(string x, string y)
    {
        if (ReferenceEquals(x, y)) return 0;
        if (x == null) return -1;
        if (y == null) return 1;
        for (int i = 0, len = Math.Min(x.Length, y.Length); i < len; ++i)
            if (x[i] != y[i] && !similarChars[x[i]].Contains(y[i]))
                return x[i].CompareTo(y[i]);
        return x.Length.CompareTo(y.Length);
    }
    public override bool Equals(string x, string y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (x == null || y == null) return false;
        if (x.Length != y.Length) return false;
        for (int i = 0; i < x.Length; ++i)
            if (x[i] != y[i] && !similarChars[x[i]].Contains(y[i]))
                return false;
        return true;
    }
    public override int GetHashCode(string obj)
    {
        if (obj == null) throw new ArgumentNullException(nameof(obj));
        return obj.GetHashCode();
    }
}

Тест:

var comparer = TypefaceAwareComparer.Instance;
var x = "TAMAPA"; // Eng
var y = "ТАМАРА"; // Rus
Console.WriteLine(comparer.Equals(x, y)); // True

Теперь можно передавать TypefaceAwareComparer.Instance в любые методы сортировки/группировки/etc.

Answer 3

Тут несколько решений прослеживается на разных типах данных. Вот вы сами можете начать с массива, списка, попробовать dictionary, hashset. По-моему ваш вопрос и одновременно простой для изучения и интересный в плане возможностей по дальнейшему расширению.

Ну, допустим, на Dictionary:

Dictionary<char, char> mydic = new Dictionary<char, char>
{
    { 'A', 'А' },
    { 'C', 'С' },
};
foreach (var element in mydic)
{
    Console.WriteLine($"eng code - {(int)element.Key} |  rus code {(int)element.Value}");
}

На верхнем уровне я вижу как минимум три вещи, которые могут понадобиться:

  • определение, содержит ли слово смешанные буквы
  • приведение к русскому языку
  • приведение к английскому языку

Ну то есть, что-то типа:

public interface IMixedWords
{
    bool HasMixedCharsInWord(string source);
    string AllToRus(string source);
    string AllToEng(string source);
}
public class DictionaryImplementation : IMixedWords
{
    public DictionaryImplementation(Dictionary<char, char> mydic)
    {
READ ALSO
Использование библиотеки jQuery contextMenu

Использование библиотеки jQuery contextMenu

Скачал с nuget jQuery contextMenuВсё необходимое подключил к проекту

99
Индексаторы C#, значения вывода, при различных индексах

Индексаторы C#, значения вывода, при различных индексах

я понимаю для чего служат индексаторы, но вот столкнулся с заданием, и просто не понимаю, как правильно вызвать и как передать

103
Ошибка The property is not a navigation property of entity type

Ошибка The property is not a navigation property of entity type

Пытаюсь установить связь, с таблицей другой в asp net core, у меня выдает ошибку:

122