В чем разница между этими двумя классами?
Я использовал System.StringComparer.OrdinalIgnoreCase()
и System.StringComparison.OrdinalIgnoreCase()
, и обе дают одинаковые результаты. Есть ли у них какая-либо разница или они оба?
В чем разница между этими двумя классами?
Я использовал System.StringComparer.OrdinalIgnoreCase()
и System.StringComparison.OrdinalIgnoreCase()
, и обе дают одинаковые результаты. Есть ли у них какая-либо разница или они оба?
StringComparer
- это Class
, который реализует интерфейсы сравнения, такие как IComparer
, IEqualityComparer
, IComparer<String>
, так что его можно использовать для сравнения двух строк.
StringComparison
- это просто Enum
, который вы можете передать определенным методам, чтобы указать, какое сравнение вы хотите. В этом случае я подозреваю, что основной метод использовал бы StringComparer
для фактического сравнения.
Когда использовать каждый
Строковые специфические методы, такие как String.Equals принимает только значение StringComparison
, так что вы бы использовали в этом случае.
Вы использовали бы StringComparer
для методов, которые берут сравнитель как параметр и вызывают в контексте, где будут сравниваться строки. Например, если у вас есть List<String>
, и вы хотите Сортировать этот список без учета регистра, вы можете сделать:
myList.Sort(StringComparer.OrdinalIgnoreCase);
Вопрос: зачем иметь в рамках обоих из них?
Объяснение следующее:
Определяет правила культуры, случая и сортировки, которые должны использоваться определенными перегрузки методов String.Compare и String.Equals
Представляет операцию сравнения строк, в которой используется конкретный случай и правила, основанные на культуре или порядковые сравнения.
Отмечено различие?
Во втором случае, поэтому в случае StringComparer
существует понятие типа string comparison operation
, но не string
.
Фактически, если вы посмотрите this, вы просто прочтете:
Некоторые нестроковые методы, которые имеют сравнение строк как центральное используйте тип StringComparer.
Пример из той же ссылки:
Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal)
Я использую StringComparer
как "базу" сравнения среди содержимого ссылочного типа array
.