2014-06-20 1 views
1

Как я могу сравнить char с помощью произвольного сравнения?StringComparer.InvariantCultureIgnoreCase для char

Я пробовал использовать StringComparer, но он работает только, если я конвертирую char в строку.

var cmp = StringComparer.InvariantCultureIgnoreCase; 
char a = 'a'; 
char A = 'A'; 
cmp.Equals(a.ToString(), A.ToString()) //true - works 
cmp.Equals(a, A) //false, working on the .Equals(object,object) 

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

+1

1) Для простых случаев использование 'char.ToLower' /' char.ToUpper' будет работать. Но я уверен, что он не будет работать для некоторых кодов Unicode. 2) Перед сравнением вы можете преобразовать в 'string', но это приводит к увеличению производительности мусора и затрат. – CodesInChaos

+0

В чем проблема с преобразованием в строку и использованием методов, которые вы упомянули? – StingyJack

+0

@CodesInChaos Я обновил вопрос, и использование ToUpper больше не является тривиальным решением. – hultqvist

ответ

2

Если вы посмотрите на исходный код класса 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, вам придется сначала преобразовать их в строку.

+0

Да, это мой вывод тоже, я также посмотрел дальше на часть, которая выполняет сравнение строк, но заканчивается на inner_call. – hultqvist

Смежные вопросы