[C#] Qual è il modo corretto per confrontare il caso che ignora il caso?


Answers

Usando la cultura predefinita (che non è invariante):

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

O specifica una cultura:

CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{  ....  }
Question

Mi chiedo quale sia il modo corretto di confrontare due personaggi ignorando il caso che funzionerà per tutte le culture. Inoltre, è Comparer<char>.Default il modo migliore per testare due caratteri senza ignorare il caso? Funziona per coppie surrogate?

EDIT : Aggiunta dell'implementazione IComparer<char> esempio

Se questo aiuta qualcuno è questo che ho deciso di usare

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()));



string.Compare ("stringa a", "STRING A", vero)

Funzionerà per ogni stringa




Quello che stavo pensando che sarebbe disponibile all'interno del runtime è qualcosa di simile al seguente

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()));