Если вы посмотрите на исходный код класса StringComparer
, вы увидите, что происходит. InvariantCultureIgnoreCase
член создает новый экземпляр класса CultureAwareComparer
:
private static readonly StringComparer _invariantCultureIgnoreCase = new CultureAwareComparer(CultureInfo.InvariantCulture, true);
CultureAwareComparer
класса реализует метод Equals(String, String)
и принимает культуру и тематические варианты во внимание. Он не реализует Equals(Object, Object)
, который определен в базовом классе StringComparer
и вызывается вместо этого, когда вы пытаетесь сравнить 2 char
. Определение StringComparer.Equals(Object, Object)
является:
public new bool Equals(Object x, Object y) {
if (x == y) return true;
if (x == null || y == null) return false;
String sa = x as String;
if (sa != null) {
String sb = y as String;
if(sb != null) {
return Equals(sa, sb);
}
}
return x.Equals(y);
}
Как вы можете видеть, он преобразует оба char
с до String
, а затем вызывает метод String.Equals(String, String)
, стандартный String
сравнение, которое не принимает культуру или дело во внимание. Итак, если вы хотите сравнить char
с культурой StringComparer
, вам придется сначала преобразовать их в строку.
1) Для простых случаев использование 'char.ToLower' /' char.ToUpper' будет работать. Но я уверен, что он не будет работать для некоторых кодов Unicode. 2) Перед сравнением вы можете преобразовать в 'string', но это приводит к увеличению производительности мусора и затрат. – CodesInChaos
В чем проблема с преобразованием в строку и использованием методов, которые вы упомянули? – StingyJack
@CodesInChaos Я обновил вопрос, и использование ToUpper больше не является тривиальным решением. – hultqvist