Realizar operaciones de cadenas que no tienen en cuenta las referencias culturales en colecciones

Hay clases y miembros en el espacio de nombres System.Collections que proporcionan un comportamiento que tiene en cuenta las referencias culturales de manera predeterminada. Los constructores predeterminados para las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider inicializan una nueva instancia usando la propiedad Thread.CurrentCulture. Todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable crean una nueva instancia de la clase Hashtable utilizando la propiedad Thread.CurrentCulture de manera predeterminada. Las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta las referencias culturales de manera predeterminada, utilizando la propiedad Thread.CurrentCulture. La propiedad Thread.CurrentCulture puede afectar a la ordenación y la búsqueda en una clase SortedList cuando las cadenas se utilizan como claves. Siga las recomendaciones de uso proporcionadas en esta sección para obtener resultados que no tengan en cuenta las referencias culturales de estas clases y métodos en el espacio de nombres Collections.

Utilizar las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider

Los constructores predeterminados para CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer inicializan una nueva instancia de la clase utilizando Thread.CurrentCulture, lo que resulta en un comportamiento que tiene en cuenta las referencias culturales. El siguiente ejemplo de código muestra el constructor de Hashtable, que tiene en cuenta las referencias culturales porque utiliza los constructores predeterminados para CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer.

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

Si desea crear un Hashtable que no tenga en cuenta las referencias culturales utilizando las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider, inicialice nuevas instancias de estas clases utilizando los constructores que acepten un parámetro de referencia cultural. Especifique CultureInfo.InvariantCulture para el parámetro de referencia cultural. El siguiente ejemplo de código muestra el constructor para un Hashtable que no tenga en cuenta las referencias culturales.

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

Utilizar el método CollectionsUtil.CreateCaseInsensitiveHashTable

El método CollectionsUtil.CreateCaseInsensitiveHashTable es una forma útil de crear rápidamente una nueva instancia de la clase Hashtable que no tenga en cuenta si las cadenas tienen mayúsculas o minúsculas. Sin embargo, todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable tienen en cuenta las referencias culturales porque utilizan la propiedad Thread.CurrentCulture. No se puede crear una Hashtable que no tenga en cuenta las referencias culturales utilizando este método. Para crear una Hashtable que no tenga en cuenta las referencias culturales, utilice el constructor de Hashtable que acepte un parámetro de referencia cultural. Especifique CultureInfo.InvariantCulture para el parámetro de referencia cultural. El siguiente ejemplo de código muestra el constructor para un Hashtable que no tenga en cuenta las referencias culturales.

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

Utilizar la clase SortedList

Una SortedList representa una colección de pares de clave y valor que se ordenan según las claves y a los cuales se puede obtener acceso mediante las claves o el índice. Cuando se usa una SortedList donde las cadenas son las claves, la ordenación y la búsqueda pueden verse afectados por la propiedad Thread.CurrentCulture. Para obtener un comportamiento que no tenga en cuenta las referencias culturales desde una SortedList, créela utilizando uno de los constructores que acepten un parámetro comparer. El parámetro comparer especifica la implementación de IComparer que se va a utilizar al comparar las claves. Especifique una clase comparadora personalizada para el parámetro IComparer que utilice CultureInfo.InvariantCulture para comparar las claves. El ejemplo siguiente ilustra una clase comparadora personalizada que no tiene en cuenta las referencias culturales, que puede especificar como el parámetro IComparer para un constructor 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 general, si utiliza una SortedList en cadenas sin especificar un comparador personalizado invariable, el cambio a Thread.CurrentCulture después de que la lista se haya llenado puede invalidar dicha lista.

Utilizar el método ArrayList.Sort

Las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta las referencias culturales de manera predeterminada, utilizando la propiedad Thread.CurrentCulture. Los resultados pueden cambiar en función de las referencias culturales debido a los diferentes criterios de ordenación. Para eliminar el comportamiento que tiene en cuenta las referencias culturales, utilice las sobrecargas de este método que acepten el parámetro IComparer. Especifique una clase comparadora invariable personalizada para el parámetro IComparer que utilice CultureInfo.InvariantCulture. Se proporciona un ejemplo de clase comparadora invariable personalizada en el tema Utilizar la clase SortedList.

Vea también

Referencia

CaseInsensitiveComparer Class
CaseInsensitiveHashCodeProvider Class
CollectionsUtil.CreateCaseInsensitiveHashTable Method
ArrayList.Sort Method
SortedList Class
Hashtable Class
IComparer Interface

Otros recursos

Realizar operaciones de cadenas que no distinguen entre referencias culturales