При чтении "Следующего Основного Языка программирования: Игра Перспектива Developer’s" Tim Sweeney, Эпическими Играми, моя первая мысль была - я добрался для изучения Haskell.
Google's HTML
Это зависит от того, что вы подразумеваете под «работой для всех культур». Хотели бы вы, чтобы «я» и «я» были равны даже в Турции?
Вы могли бы использовать:
bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);
... но я не уверен, что это «работает» для всех культур, исходя из вашего понимания » работает ».
Конечно, вы можете преобразовать оба символа в строки, а затем выполнить любое сравнение, которое вы хотите, со строками. Несколько менее эффективен, но он дает вам весь диапазон сравнений, доступных в структуре:
bool equal = x.ToString().Equals(y.ToString(),
StringComparison.InvariantCultureIgnoreCase);
Для суррогатных пар Comparer
в любом случае будет невозможным, потому что вы этого не сделаете. t иметь один символ
. Однако вы можете создать Comparer
.
Использование языка и региональных параметров по умолчанию (то есть , а не инварианта):
if (char.ToLower(ch1) == char.ToLower(ch2))
{ .... }
Или укажите культуру:
CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{ .... }
Насколько я понимаю, на самом деле нет способа, который "работал бы для всех культур" ". Либо вы хотите сравнить символы по какой-то внутренней, не отображаемой пользователю причине (в этом случае вам следует использовать InvariantCulture), либо вы хотите использовать CurrentCulture пользователя. Очевидно, что использование текущей культуры пользователя будет означать, что вы получите разные результаты в разных регионах, но они будут соответствовать тому, что ожидают ваши пользователи в этих регионах.
Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я могу Я действительно не советую вам, какой из них вам следует использовать.
но они будут соответствовать тому, что ожидают ваши пользователи в этих регионах.Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я не могу посоветовать вам, какой из них вам следует использовать.
но они будут соответствовать ожиданиям ваших пользователей в этих регионах.Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я не могу посоветовать вам, какой из них вам следует использовать.
Вы можете попробовать:
class Test{
static int Compare(char t, char p){
return string.Compare(t.ToString(), p.ToString(), StringComparison.CurrentCultureIgnoreCase);
}
}
Но я сомневаюсь, что это «оптимальный» способ сделать это, но я не во всех случаях, которые вам нужно проверять ...
Я думал, что во время выполнения будет доступно что-то вроде следующего
public class CaseInsensitiveCharComparer : IComparer<char> {
private readonly System.Globalization.CultureInfo ci;
public CaseInsensitiveCharComparer(System.Globalization.CultureInfo ci) {
this.ci = ci;
}
public CaseInsensitiveCharComparer()
: this(System.Globalization.CultureInfo.CurrentCulture) { }
public int Compare(char x, char y) {
return Char.ToUpper(x, ci) - Char.ToUpper(y, ci);
}
}
// Prints 3
Console.WriteLine("This is a test".CountChars('t', new CaseInsensitiveCharComparer()));
Я бы порекомендовал сравнить верхний регистр, и если они не совпадают, то сравнить строчные, на всякий случай, если логика верхнего и нижнего регистра языковых стандартов немного отличается.
Приложение
Например,
int CompareChar(char c1, char c2)
{
int dif;
dif = char.ToUpper(c1) - char.ToUpper(c2);
if (diff != 0)
dif = char.ToLower(c1) - char.ToLower(c2);
return dif;
}
string.Compare ("string a", "STRING A", true)
Он будет работать для каждой строки