Что корректный путь состоит в том, чтобы сравнить регистр игнорирующего символа?

При чтении "Следующего Основного Языка программирования: Игра Перспектива Developer’s" Tim Sweeney, Эпическими Играми, моя первая мысль была - я добрался для изучения Haskell.

версия

PPT

Google's HTML

47
задан Brett Ryan 8 September 2009 в 17:11
поделиться

7 ответов

Это зависит от того, что вы подразумеваете под «работой для всех культур». Хотели бы вы, чтобы «я» и «я» были равны даже в Турции?

Вы могли бы использовать:

bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);

... но я не уверен, что это «работает» для всех культур, исходя из вашего понимания » работает ».

Конечно, вы можете преобразовать оба символа в строки, а затем выполнить любое сравнение, которое вы хотите, со строками. Несколько менее эффективен, но он дает вам весь диапазон сравнений, доступных в структуре:

bool equal = x.ToString().Equals(y.ToString(), 
                                 StringComparison.InvariantCultureIgnoreCase);

Для суррогатных пар Comparer в любом случае будет невозможным, потому что вы этого не сделаете. t иметь один символ . Однако вы можете создать Comparer .

81
ответ дан 26 November 2019 в 19:38
поделиться

Использование языка и региональных параметров по умолчанию (то есть , а не инварианта):

if (char.ToLower(ch1) == char.ToLower(ch2))
{  ....  }

Или укажите культуру:

CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{  ....  }
13
ответ дан 26 November 2019 в 19:38
поделиться

Насколько я понимаю, на самом деле нет способа, который "работал бы для всех культур" ". Либо вы хотите сравнить символы по какой-то внутренней, не отображаемой пользователю причине (в этом случае вам следует использовать InvariantCulture), либо вы хотите использовать CurrentCulture пользователя. Очевидно, что использование текущей культуры пользователя будет означать, что вы получите разные результаты в разных регионах, но они будут соответствовать тому, что ожидают ваши пользователи в этих регионах.

Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я могу Я действительно не советую вам, какой из них вам следует использовать.

но они будут соответствовать тому, что ожидают ваши пользователи в этих регионах.

Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я не могу посоветовать вам, какой из них вам следует использовать.

но они будут соответствовать ожиданиям ваших пользователей в этих регионах.

Не зная больше о том, ПОЧЕМУ вы сравниваете два символа, я не могу посоветовать вам, какой из них вам следует использовать.

2
ответ дан 26 November 2019 в 19:38
поделиться

Вы можете попробовать:

    class Test{
    static int Compare(char t, char p){
        return string.Compare(t.ToString(), p.ToString(), StringComparison.CurrentCultureIgnoreCase);
    }
}

Но я сомневаюсь, что это «оптимальный» способ сделать это, но я не во всех случаях, которые вам нужно проверять ...

0
ответ дан 26 November 2019 в 19:38
поделиться

Я думал, что во время выполнения будет доступно что-то вроде следующего

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()));
0
ответ дан 26 November 2019 в 19:38
поделиться

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

Приложение

Например,

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;
}
0
ответ дан 26 November 2019 в 19:38
поделиться

string.Compare ("string a", "STRING A", true)

Он будет работать для каждой строки

-1
ответ дан 26 November 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: