C# Сравнение строк без учета диакритических знаков, кроме полупространства Юникод (\ u200 c) - PullRequest
1 голос
/ 20 февраля 2020

У меня есть ICollectionView, привязанный к DataGrid, который содержит 1 миллион элементов и должен быть отфильтрован как пользовательский тип в текстовом поле поиска. Из-за большого количества элементов алгоритм фильтрации должен быть дружественным к производительности.

Это мое текущее сравнение строк (некоторая часть метода фильтрации):

static bool AreEqual(string str1, string str2)
{
    var compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    bool result = compareInfo.IndexOf(str1, str2, CompareOptions.IgnoreNonSpace) > -1;
    return result;
}

CompareOptions.IgnoreNonSpace очень хорошо игнорирует диакритические знаки, но игнорирует также половину пробела с Unicode \ u200 c, также что не то, что я хочу. Я просто хочу игнорировать диакритические знаки.

bool compare1 = AreEqual("آبی","آبی");  //true, It's Okay.
bool compare2 = AreEqual("آبی", "ابی"); //true. It's Okay.
bool compare3 = AreEqual("آبی", "آب‌ی"); //true. This is not what I want. It should return false
bool compare4 = AreEqual("آبی", "اب‌ی"); //true. This is not what I want. It should return false.

Поскольку производительность является критической, я не могу удалить диакритические знаки с помощью нормализующих строк перед сравнением.

Еще один вопрос :

Я хочу отфильтровать CollectionView таким образом, чтобы первые 10 результатов возвращались и продолжали поиск в фоновом потоке, пока пользователь читает текущий DataGrid видовой экран. Когда пользователь прокручивает DataGrid, показываются следующие 10 результатов, которые фильтруются в фоновом потоке. Я не хочу, чтобы пользователь ждал, пока CollectionView завершит sh фильтрацию 1 миллиона элементов.

...