Exécution d’opérations de chaînes indépendantes de la culture dans des collectionsPerforming Culture-Insensitive String Operations in 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.There are classes and members in the System.Collections namespace that provide culture-sensitive behavior by default. Les constructeurs sans paramètre pour les classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProvider initialisent une nouvelle instance en utilisant la propriété Thread.CurrentCulture.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. 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.All overloads of the CollectionsUtil.CreateCaseInsensitiveHashtable method create a new instance of the Hashtable class using the Thread.CurrentCulture property by default. Les surcharges de la méthode ArrayList.Sort effectuent des tris dépendants de la culture par défaut en utilisant Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using 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.Sorting and lookup in a SortedList can be affected by Thread.CurrentCulture when strings are used as the keys. 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.Follow the usage recommendations provided in this section to obtain culture-insensitive results from these classes and methods in the Collections namespace.

Notes

Le CultureInfo.InvariantCulture passage à une méthode de comparaison effectue une comparaison indépendante de la culture.Passing CultureInfo.InvariantCulture to a comparison method does perform a culture-insensitive comparison. 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.However, it does not cause a non-linguistic comparison, for example, for file paths, registry keys, and environment variables. Elle ne prend pas non plus en charge les décisions de sécurité basées sur le résultat de la comparaison.Neither does it support security decisions based on the comparison result. 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.For a non-linguistic comparison or support for result-based security decisions, the application should use a comparison method that accepts a StringComparison value. L’application doit ensuite transmettre StringComparison.The application should then pass StringComparison.

Utilisation des classes CaseInsensitiveComparer et CaseInsensitiveHashCodeProviderUsing the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

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.The parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer initialize a new instance of the class using the Thread.CurrentCulture, resulting in culture-sensitive behavior. 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.The following code example demonstrates the constructor for a Hashtable that is culture-sensitive because it uses the parameterless constructors for CaseInsensitiveHashCodeProvider and 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.If you want to create a culture-insensitive Hashtable using the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes, initialize new instances of these classes using the constructors that accept a culture parameter. Pour le paramètre culture, spécifiez CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. L’exemple de code suivant montre le constructeur pour un Hashtable indépendant de la culture.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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.CreateCaseInsensitiveHashtableUsing the CollectionsUtil.CreateCaseInsensitiveHashTable Method

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.The CollectionsUtil.CreateCaseInsensitiveHashTable method is a useful shortcut for creating a new instance of the Hashtable class that ignores the case of strings. Toutefois, toutes les surcharges de la méthode CollectionsUtil.CreateCaseInsensitiveHashTable sont dépendantes de la culture car elles utilisent la propriété Thread.CurrentCulture.However, all overloads of the CollectionsUtil.CreateCaseInsensitiveHashTable method are culture-sensitive because they use the Thread.CurrentCulture property. Vous ne pouvez pas créer un Hashtable indépendant de la culture à l’aide de cette méthode.You cannot create a culture-insensitive Hashtable using this method. Pour créer un Hashtable indépendant de la culture, utilisez le constructeur Hashtable qui accepte un paramètre culture.To create a culture-insensitive Hashtable, use the Hashtable constructor that accepts a culture parameter. Pour le paramètre culture, spécifiez CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. L’exemple de code suivant montre le constructeur pour un Hashtable indépendant de la culture.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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 SortedListUsing the SortedList Class

Un SortedList représente une collection de paires clé/valeur triées par les clés et accessibles par clé et par index.A SortedList represents a collection of key-and-value pairs that are sorted by the keys and are accessible by key and by 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.When you use a SortedList where strings are the keys, the sorting and lookup can be affected by the Thread.CurrentCulture property. 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.To obtain culture-insensitive behavior from a SortedList, create a SortedList using one of the constructors that accepts a comparer parameter. Le paramètre comparer spécifie l’implémentation IComparer à utiliser lors de la comparaison des clés.The comparer parameter specifies the IComparer implementation to use when comparing keys. Pour le paramètre, spécifiez une classe de comparateur personnalisée qui utilise CultureInfo.InvariantCulture pour comparer des clés.For the parameter, specify a custom comparer class that uses CultureInfo.InvariantCulture to compare keys. 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.The following example illustrates a custom culture-insensitive comparer class that you can specify as the comparer parameter to a SortedList constructor.

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 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.In general, if you use a SortedList on strings without specifying a custom invariant comparer, a change to Thread.CurrentCulture after the list has been populated can invalidate the list.

Utilisation de la méthode ArrayList.SortUsing the ArrayList.Sort Method

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.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using the Thread.CurrentCulture property. Les résultats peuvent varier selon la culture en raison des différents ordres de tri.Results can vary by culture due to different sort orders. Pour supprimer un comportement dépendant de la culture, utilisez les surcharges de cette méthode qui acceptent une implémentation IComparer.To eliminate culture-sensitive behavior, use the overloads of this method that accept an IComparer implementation. Pour le paramètre comparer, spécifiez une classe de comparateur indifférent personnalisée qui utilise CultureInfo.InvariantCulture.For the comparer parameter, specify a custom invariant comparer class that uses CultureInfo.InvariantCulture. Un exemple de classe de comparateur indifférent personnalisée est fourni dans la rubrique Utilisation de la classe SortedList.An example of a custom invariant comparer class is provided in the Using the SortedList Class topic.

Voir aussiSee also