Есть набор символов, которые одинаково выглядят как на русском так и на английском языках (А,В,С,Е,Н,К,М,О,Р,Т,Х). Мне хотелось бы сравнивать эти буквы независимо от того, русские они или латинские. То есть например есть список с буквами вразнобой русские и английские и например хочу найти букву А в этом списке и мне бы показало букву А(русскую) и букву А(английскую). Как можно это реализовать?
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
Напишите свой 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.
Тут несколько решений прослеживается на разных типах данных. Вот вы сами можете начать с массива, списка, попробовать 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)
{
Виртуальный выделенный сервер (VDS) становится отличным выбором
Скачал с nuget jQuery contextMenuВсё необходимое подключил к проекту
я понимаю для чего служат индексаторы, но вот столкнулся с заданием, и просто не понимаю, как правильно вызвать и как передать
Пытаюсь установить связь, с таблицей другой в asp net core, у меня выдает ошибку: