Partager via


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

L'espace de noms System.Collections contient des classes et des membres qui génèrent un comportement dépendant de la culture par défaut. Les constructeurs par défaut des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider initialisent une nouvelle instance à l'aide de la propriété Thread.CurrentCulture. Toutes les surcharges de la méthode CollectionsUtil.CreateCaseInsensitiveHashTable créent une instance de la classe Hashtable 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 à l'aide de Thread.CurrentCulture. Le tri et la consultation dans SortedList peuvent être affectés par Thread.CurrentCulture lorsque des chaînes sont utilisées comme clés. Suivez les recommandations d'utilisation contenues dans cette section pour obtenir des résultats indépendants de la culture de la part de ces classes et de ces méthodes dans l'espace de noms Collections.

Remarque   Le passage de CultureInfo.InvariantCulture à une méthode de comparaison effectue une comparaison indépendante de la culture. Toutefois, il n'entraîne pas de comparaison non linguistique, par exemple, pour les chemins d'accès de fichier, les clés de Registre et les variables d'environnement. Il 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é dépendantes du résultat, l'application doit utiliser une méthode de comparaison qui accepte une valeur StringComparison. L'application doit ensuite passer Ordinal.

Utilisation des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider

Les constructeurs par défaut pour CaseInsensitiveHashCodeProvider et CaseInsensitiveComparer initialisent une nouvelle instance de la classe à l'aide de Thread.CurrentCulture, ce qui se traduit par un comportement dépendant de la culture. L'exemple de code suivant montre le constructeur d'une Hashtable dépendante de la culture parce qu'elle utilise les constructeurs par défaut pour CaseInsensitiveHashCodeProvider et CaseInsensitiveComparer.

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

Si vous voulez créer une Hashtable indépendante de la culture à l'aide des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider, initialisez les nouvelles instances de ces classes à l'aide de constructeurs qui acceptent un paramètre culture. Pour le paramètre culture, spécifiez CultureInfo.InvariantCulture. L'exemple de code suivant illustre le constructeur d'une Hashtable indépendante 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));

Utilisation de la méthode CollectionsUtil.CreateCaseInsensitiveHashTable

La méthode CollectionsUtil.CreateCaseInsensitiveHashTable est un raccourci utile pour la création d'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 de Hashtable indépendante de la culture à l'aide de cette méthode. Pour créer une Hashtable indépendante 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 illustre le constructeur d'une Hashtable indépendante 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));

Utilisation de la classe SortedList

Un SortedList représente une collection de paires clé/valeur triées par les clés et accessible 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 que le comportement de SortedList soit indépendant de la culture, créez un SortedList en utilisant l'un des constructeurs acceptant un paramètre comparer. Le paramètre comparer indique l'implémentation IComparer à utiliser lors de la comparaison de clés. Pour le paramètre, spécifiez une classe de comparateur personnalisée qui utilise CultureInfo.InvariantCulture pour comparer les clés. L'exemple suivant illustre une classe de comparateur personnalisé indépendant de la culture que vous pouvez spécifier comme paramètre comparer pour un constructeur SortedList.

Imports System
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 m_compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer() 
    {
        m_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }
    
    public int Compare(Object a, Object b)
    {
        String sa = a as String;
        String sb = b as String;
        if (sa != null && sb != null)
            return m_compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

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

Utilisation de 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 cette dépendance à la culture, utilisez les surcharges de cette méthode acceptant une implémentation de IComparer. Pour le paramètre comparer, spécifiez une classe de comparateur indifférent personnalisé qui utilise CultureInfo.InvariantCulture. La rubrique Utilisation de la classe SortedList contient un exemple de classe de comparateur indifférent personnalisé.

Voir aussi

Référence

CaseInsensitiveComparer

CaseInsensitiveHashCodeProvider

Méthode CollectionsUtil.CreateCaseInsensitiveHashTable

ArrayList.Sort

SortedList

Hashtable

IComparer

Autres ressources

Exécution d'opérations de chaînes indépendantes de la culture