Подтвердить что ты не робот

Разница между классами System.StringComparer и System.StringComparison?

В чем разница между этими двумя классами?

Я использовал System.StringComparer.OrdinalIgnoreCase() и System.StringComparison.OrdinalIgnoreCase(), и обе дают одинаковые результаты. Есть ли у них какая-либо разница или они оба?

4b9b3361

Ответ 1

StringComparer - это Class, который реализует интерфейсы сравнения, такие как IComparer, IEqualityComparer, IComparer<String>, так что его можно использовать для сравнения двух строк.

StringComparison - это просто Enum, который вы можете передать определенным методам, чтобы указать, какое сравнение вы хотите. В этом случае я подозреваю, что основной метод использовал бы StringComparer для фактического сравнения.

Когда использовать каждый

Строковые специфические методы, такие как String.Equals принимает только значение StringComparison, так что вы бы использовали в этом случае.

Вы использовали бы StringComparer для методов, которые берут сравнитель как параметр и вызывают в контексте, где будут сравниваться строки. Например, если у вас есть List<String>, и вы хотите Сортировать этот список без учета регистра, вы можете сделать:

myList.Sort(StringComparer.OrdinalIgnoreCase);

Ответ 2

Вопрос: зачем иметь в рамках обоих из них?

Объяснение следующее:

  • StringComparison:

Определяет правила культуры, случая и сортировки, которые должны использоваться определенными перегрузки методов String.Compare и String.Equals

  • StringComparer:

Представляет операцию сравнения строк, в которой используется конкретный случай и правила, основанные на культуре или порядковые сравнения.

Отмечено различие?

Во втором случае, поэтому в случае StringComparer существует понятие типа string comparison operation, но не string.

Фактически, если вы посмотрите this, вы просто прочтете:

Некоторые нестроковые методы, которые имеют сравнение строк как центральное используйте тип StringComparer.

Пример из той же ссылки:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal)

Я использую StringComparer как "базу" сравнения среди содержимого ссылочного типа array.