Partager via


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

Mise à jour : novembre 2007

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 nouvelle instance de la classe Hashtable à l'aide de 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 un SortedList peuvent être affectés par Thread.CurrentCulture lorsque les 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 de l'espace de noms Collections.

Utilisation des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider

Les constructeurs par défaut de CaseInsensitiveHashCodeProvider et CaseInsensitiveComparer initialisent une nouvelle instance de la classe à l'aide de Thread.CurrentCulture, ce qui permet d'obtenir un comportement dépendant de la culture. L'exemple de code suivant illustre le constructeur de Hashtable qui est dépendant de la culture, car il utilise les constructeurs par défaut de 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, initialisez des nouvelles instances de ces classes à l'aide de constructeurs qui acceptent un paramètre culture. Pour le paramètre de culture, spécifiez CultureInfo.InvariantCulture. L'exemple de code suivant illustre le constructeur d'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));

Utilisation de 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 de 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 illustre le constructeur d'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));

Utilisation de la classe SortedList

SortedList représente une collection de paires valeur-clé 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 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 IComparer, spécifiez une classe de comparateur personnalisé qui utilise CultureInfo.InvariantCulture pour comparer des clés. L'exemple suivant illustre une classe de comparateur personnalisé indépendant de la culture que vous pouvez spécifier comme paramètre IComparer pour un constructeur de 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 un paramètre IComparer. Pour le paramètre IComparer, spécifiez une classe de comparateur personnalisé indifférent 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

CollectionsUtil.CreateCaseInsensitiveHashTable

ArrayList.Sort

SortedList

Hashtable

IComparer

Autres ressources

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