Exécution d’opérations de chaînes indépendantes de la culture dans des collections

Des classes et des membres dans l’espace de noms System.Collections génèrent un comportement dépendant de la culture par défaut. Les constructeurs sans paramètre pour les classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider initialisent une nouvelle instance en utilisant la propriété Thread.CurrentCulture. Toutes les surcharges de la méthode CollectionsUtil.CreateCaseInsensitiveHashtable créent une nouvelle instance de la classe Hashtable en utilisant la propriété Thread.CurrentCulture par défaut. Les surcharges de la méthode ArrayList.Sort effectuent des tris dépendants de la culture par défaut en utilisant Thread.CurrentCulture. Le tri et la recherche dans SortedList peuvent être affectés par Thread.CurrentCulture lorsque des chaînes sont utilisées en tant que clés. Suivez les recommandations d’utilisation fournies dans cette section pour obtenir des résultats indépendants de la culture à partir de ces classes et méthodes dans l’espace de noms Collections.

Notes

La transmission de CultureInfo.InvariantCulture à une méthode de comparaison effectue une comparaison indépendante de la culture. Toutefois, elle n’entraîne pas une comparaison non linguistique, par exemple, pour les chemins d’accès de fichier, les clés de Registre et les variables d’environnement. Elle ne prend pas non plus en charge les décisions de sécurité basées sur le résultat de la comparaison. Pour une comparaison non linguistique ou la prise en charge des décisions de sécurité basées sur le résultat, l’application doit utiliser une méthode de comparaison qui accepte une valeur StringComparison. L’application doit ensuite transmettre StringComparison.

Utiliser les classes et CaseInsensitiveHashCodeProviderCaseInsensitiveComparer

Les constructeurs sans paramètre pour CaseInsensitiveHashCodeProvider et CaseInsensitiveComparer lancent une nouvelle instance de la classe à l’aide de Thread.CurrentCulture, qui entraîne un comportement dépendant de la culture. L’exemple de code suivant montre le constructeur pour un Hashtable qui est dépendant de la culture car il utilise les constructeurs sans paramètre pour CaseInsensitiveHashCodeProvider et CaseInsensitiveComparer.

internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

Si vous souhaitez créer un Hashtable indépendant de la culture à l’aide des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider, lancez de nouvelles instances de ces classes à l’aide des constructeurs qui acceptent un paramètre culture. Pour le paramètre culture, spécifiez CultureInfo.InvariantCulture. L’exemple de code suivant montre le constructeur pour un Hashtable indépendant de la culture.

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

Utiliser la méthode CollectionsUtil.CreateCaseInsensitiveHashTable

La méthode CollectionsUtil.CreateCaseInsensitiveHashTable est un raccourci utile pour créer une nouvelle instance de la classe Hashtable qui ignore la casse des chaînes. Toutefois, toutes les surcharges de la méthode CollectionsUtil.CreateCaseInsensitiveHashTable sont dépendantes de la culture car elles utilisent la propriété Thread.CurrentCulture. Vous ne pouvez pas créer un Hashtable indépendant de la culture à l’aide de cette méthode. Pour créer un Hashtable indépendant de la culture, utilisez le constructeur Hashtable qui accepte un paramètre culture. Pour le paramètre culture, spécifiez CultureInfo.InvariantCulture. L’exemple de code suivant montre le constructeur pour un Hashtable indépendant de la culture.

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

Utiliser la classe SortedList

Un SortedList représente une collection de paires clé/valeur triées par les clés et accessibles par clé et par index. Lorsque vous utilisez un SortedList où des chaînes sont les clés, le tri et la recherche peuvent être affectés par la propriété Thread.CurrentCulture. Pour obtenir un comportement indépendant de la culture d’un SortedList, créez un SortedList à l’aide d’un des constructeurs qui acceptent un paramètre comparer. Le paramètre comparer spécifie l’implémentation IComparer à utiliser lors de la comparaison des clés. Pour le paramètre, spécifiez une classe de comparateur personnalisée qui utilise CultureInfo.InvariantCulture pour comparer des clés. L’exemple suivant illustre une classe de comparateur indépendante de la culture personnalisée que vous pouvez spécifier en tant que paramètre comparer dans un constructeur SortedList.

Imports System.Collections
Imports System.Globalization

Friend Class InvariantComparer
    Implements IComparer
    Private m_compareInfo As CompareInfo
    Friend Shared [Default] As New InvariantComparer()

    Friend Sub New()
        m_compareInfo = CultureInfo.InvariantCulture.CompareInfo
    End Sub

    Public Function Compare(a As Object, b As Object) As Integer _
            Implements IComparer.Compare
        Dim sa As String = CType(a, String)
        Dim sb As String = CType(b, String)
        If Not (sa Is Nothing) And Not (sb Is Nothing) Then
            Return m_compareInfo.Compare(sa, sb)
        Else
            Return Comparer.Default.Compare(a, b)
        End If
    End Function
End Class
using System;
using System.Collections;
using System.Globalization;

internal class InvariantComparer : IComparer
{
    private CompareInfo _compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer()
    {
        _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }

    public int Compare(Object a, Object b)
    {
        if (a is string sa && b is string sb)
            return _compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

En général, si vous utilisez un SortedList sur des chaînes sans spécifier de comparateur indifférent personnalisé, une modification sur Thread.CurrentCulture lorsque la liste est remplie peut invalider cette liste.

Utiliser la méthode ArrayList.Sort

Les surcharges de la méthode ArrayList.Sort effectuent des tris dépendants de la culture par défaut à l’aide de la propriété Thread.CurrentCulture. Les résultats peuvent varier selon la culture en raison des différents ordres de tri. Pour supprimer un comportement dépendant de la culture, utilisez les surcharges de cette méthode qui acceptent une implémentation IComparer. Pour le paramètre comparer, spécifiez une classe de comparateur indifférent personnalisée qui utilise CultureInfo.InvariantCulture. Un exemple de classe de comparateur indifférent personnalisée est fourni dans la rubrique Utilisation de la classe SortedList.

Voir aussi