Realizar operaciones de cadenas que no tienen en cuenta las referencias culturales en coleccionesPerforming Culture-Insensitive String Operations in Collections

En el espacio de nombres System.Collections hay clases y miembros que proporcionan, de manera predeterminada, el comportamiento que tiene en cuenta la referencia cultural.There are classes and members in the System.Collections namespace that provide culture-sensitive behavior by default. Los constructores sin parámetros de las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider inicializan una instancia nueva con la propiedad Thread.CurrentCulture.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. Todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashtable crean una instancia de la clase Hashtable mediante la propiedad Thread.CurrentCulture de forma predeterminada.All overloads of the CollectionsUtil.CreateCaseInsensitiveHashtable method create a new instance of the Hashtable class using the Thread.CurrentCulture property by default. Las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta las referencias culturales de manera predeterminada con Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using Thread.CurrentCulture. SortedList puede afectar la ordenación y la búsqueda en Thread.CurrentCulture cuando las cadenas se usan como las claves.Sorting and lookup in a SortedList can be affected by Thread.CurrentCulture when strings are used as the keys. Siga las recomendaciones de uso que se proporcionan en esta sección para obtener resultados que no tienen en cuenta la referencia cultural de estas clases y métodos en el espacio de nombres Collections.Follow the usage recommendations provided in this section to obtain culture-insensitive results from these classes and methods in the Collections namespace.

Nota Pasar CultureInfo.InvariantCulture a un método de comparación realiza una comparación que no tiene en cuenta la referencia cultural.Note Passing CultureInfo.InvariantCulture to a comparison method does perform a culture-insensitive comparison. Si embargo, no provoca una comparación no lingüística, por ejemplo, para las rutas de acceso de archivo, las claves del Registro y las variables de entorno.However, it does not cause a non-linguistic comparison, for example, for file paths, registry keys, and environment variables. Tampoco admite las decisiones de seguridad basadas en el resultado de la comparación.Neither does it support security decisions based on the comparison result. Para una comparación no lingüística o la compatibilidad con las decisiones de seguridad basadas en los resultados, la aplicación debe usar un método de comparación que acepte un valor 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. A continuación, la aplicación debe pasar StringComparison.The application should then pass StringComparison.

Uso de las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProviderUsing the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

Los constructores sin parámetros para CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer inicializan una instancia nueva de la clase con Thread.CurrentCulture, lo que genera un comportamiento que tiene en cuenta las referencias culturales.The parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer initialize a new instance of the class using the Thread.CurrentCulture, resulting in culture-sensitive behavior. En el ejemplo de código siguiente se muestra el constructor de Hashtable que tiene en cuenta las referencias culturales porque usa los constructores sin parámetros para CaseInsensitiveHashCodeProvider y 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 desea crear Hashtable que no tiene en cuenta las referencias culturales con las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider, inicialice instancias nuevas de estas clases con los constructores que aceptan un parámetro 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. Para el parámetro culture, especifique CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. El ejemplo de código siguiente muestra el constructor para un Hashtable que no tiene en cuenta las referencias culturales.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));  

Uso del método CollectionsUtil.CreateCaseInsensitiveHashTableUsing the CollectionsUtil.CreateCaseInsensitiveHashTable Method

El método CollectionsUtil.CreateCaseInsensitiveHashTable es un acceso directo para crear una instancia de la clase Hashtable que no toma en cuenta las mayúsculas y minúsculas de las cadenas.The CollectionsUtil.CreateCaseInsensitiveHashTable method is a useful shortcut for creating a new instance of the Hashtable class that ignores the case of strings. Sin embargo, todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable tienen en cuenta las referencias culturales porque usan la propiedad Thread.CurrentCulture.However, all overloads of the CollectionsUtil.CreateCaseInsensitiveHashTable method are culture-sensitive because they use the Thread.CurrentCulture property. No puede crear un Hashtable que no tiene en cuenta las referencias culturales con este método.You cannot create a culture-insensitive Hashtable using this method. Para crear un Hashtable que no tiene en cuenta las referencias culturales, use el constructor Hashtable que acepta un parámetro culture.To create a culture-insensitive Hashtable, use the Hashtable constructor that accepts a culture parameter. Para el parámetro culture, especifique CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. El ejemplo de código siguiente muestra el constructor para un Hashtable que no tiene en cuenta las referencias culturales.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));  

Uso de la clase SortedListUsing the SortedList Class

SortedList representa una colección de pares clave-valor ordenados por claves a los que se accede por clave y por índice.A SortedList represents a collection of key-and-value pairs that are sorted by the keys and are accessible by key and by index. Cuando usa SortedList donde las cadenas son las claves, la propiedad Thread.CurrentCulture puede afectar la ordenación y la búsqueda.When you use a SortedList where strings are the keys, the sorting and lookup can be affected by the Thread.CurrentCulture property. Para obtener el comportamiento que no tiene en cuenta las referencias culturales desde SortedList, cree SortedList con uno de los constructores que acepta un parámetro comparer.To obtain culture-insensitive behavior from a SortedList, create a SortedList using one of the constructors that accepts a comparer parameter. El parámetro comparer especifica la implementación IComparer para usarla al comparar claves.The comparer parameter specifies the IComparer implementation to use when comparing keys. Para el parámetro, especifique una clase de comparador personalizada que usaCultureInfo.InvariantCulture para comparar claves.For the parameter, specify a custom comparer class that uses CultureInfo.InvariantCulture to compare keys. En el ejemplo siguiente se muestra una clase de comparación que no tiene en cuenta las referencias culturales y que puede especificar como el parámetro comparer para un constructor 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 general, si usa SortedList en las cadenas sin especificar un comparador invariable personalizado, un cambio en Thread.CurrentCulture una vez que se rellena la lista puede invalidarla.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.

Uso del método ArrayList.SortUsing the ArrayList.Sort Method

Las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta las referencias culturales de manera predeterminada con la propiedad Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using the Thread.CurrentCulture property. Los resultados pueden variar según la referencia cultural debido a criterios de ordenación distintos.Results can vary by culture due to different sort orders. Para eliminar el comportamiento que tiene en cuenta las referencias culturales, use las sobrecargas de este método que aceptan una implementación IComparer.To eliminate culture-sensitive behavior, use the overloads of this method that accept an IComparer implementation. Para el parámetro comparer, especifique una clase de comparador invariable personalizada que use CultureInfo.InvariantCulture.For the comparer parameter, specify a custom invariant comparer class that uses CultureInfo.InvariantCulture. En el tema Uso de la clase SortedList se proporciona un ejemplo de una clase de comparador invariable personalizada.An example of a custom invariant comparer class is provided in the Using the SortedList Class topic.

Vea tambiénSee also