Альтернатива string.ToUpper () с StringComparison или аналогичным, которая полностью сохраняет поведение - PullRequest
3 голосов
/ 17 мая 2019

Использование left.ToUpper() == right.ToUpper() - не лучший вариант для сравнения строк, по крайней мере, из-за проблем с производительностью.Я хочу реорганизовать (полностью сохраняя поведение!) Этот код во что-то эффективное, но не могу достичь полной эквивалентности для особого случая.

Итак, вот простой метод тестирования:

[TestCase("Strasse", "Straße", "tr-TR")]
[TestCase("İ", "i", "tr-TR")]
public void UsingToUpper_AndCurrentCultureIgnoreCase_AreSame(string left, string right, string culture)
{
    // Arrange, Act
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
    var toUpper = left.ToUpper() == right.ToUpper();
    var stringComparison = left.Equals(right, StringComparison.CurrentCultureIgnoreCase);

    // Assert
    Assert.AreEqual(toUpper, stringComparison);
}

Я попробовал два варианта, StringComparison.CurrentCultureIgnoreCase и StringComparison.OrdinalIgnoreCase, оба из них не удалось (в разных случаях).

Итак, вопрос:

Есть ли способ сравнить две строки, без изменения регистра и полностью сохранить поведение ToUpper ()?

1 Ответ

0 голосов
/ 17 мая 2019

Боюсь, вам придется написать свой собственный метод сравнения.

ToUpper использует метаданные Unicode.Каждый символ (кодовая точка Unicode) имеет регистр, а также регистр в верхнем и нижнем регистре (и заглавный регистр)..NET использует эту информацию для преобразования строки в верхний или нижний регистр.Вы можете найти ту же информацию в базе данных символов Unicode.

Вы можете предоставить культуру для метода ToUpper, но это не будет вашей целью.Вы можете написать свою собственную customCulture, как определено в этом ответе: Создать пользовательскую культуру в ASP.NET

Однако, не будет никакого аналогичного поведения для метода ToUpper, как упомянуто прежде, чем он использует Unicodeметаданные.Вы не можете заставить строку Equals использовать символы Юникода.

...