Compartir a través de


Realización de operaciones de cadenas que no tienen en cuenta las referencias culturales en colecciones

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. Los constructores sin parámetros para las CaseInsensitiveComparer clases y CaseInsensitiveHashCodeProvider inicializan una nueva instancia mediante la Thread.CurrentCulture propiedad . Todas las sobrecargas del CollectionsUtil.CreateCaseInsensitiveHashtable método crean una nueva instancia de la Hashtable clase mediante la Thread.CurrentCulture propiedad de forma predeterminada. Las sobrecargas del método ArrayList.Sort realizan ordenaciones sensibles a la cultura por defecto mediante Thread.CurrentCulture. La ordenación y la búsqueda en un SortedList pueden verse afectadas por Thread.CurrentCulture cuando se utilizan cadenas como claves. Siga las recomendaciones de uso proporcionadas en esta sección para obtener resultados insensibles a las diferencias culturales de estas clases y métodos en el Collections espacio de nombres.

Nota:

Pasar CultureInfo.InvariantCulture a un método de comparación realiza una comparación insensible a las diferencias culturales. Sin embargo, no provoca una comparación no lingüística, por ejemplo, para rutas de acceso de archivo, claves del Registro y variables de entorno. Tampoco admite decisiones de seguridad basadas en el resultado de la comparación. Para una comparación no lingüística o compatibilidad con decisiones de seguridad basadas en resultados, la aplicación debe usar un método de comparación que acepte un StringComparison valor. A continuación, la aplicación debe pasar StringComparison.

Uso de las CaseInsensitiveComparer clases y CaseInsensitiveHashCodeProvider

Los constructores sin parámetros para CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer inicializan una nueva instancia de la clase mediante Thread.CurrentCulture, resultando en un comportamiento sensible a la cultura. En el ejemplo de código siguiente se muestra el constructor de un Hashtable que es sensible a la cultura porque usa los constructores sin parámetros para CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer.

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

Si desea crear una clase insensible a la cultura Hashtable utilizando las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider, inicialice nuevas instancias de estas clases mediante los constructores que aceptan un parámetro culture. Para el parámetro culture, especifique CultureInfo.InvariantCulture. El siguiente ejemplo de código muestra el constructor para un Hashtable independiente de la cultura.

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

Uso del CollectionsUtil.CreateCaseInsensitiveHashTable método

El CollectionsUtil.CreateCaseInsensitiveHashTable método es un acceso directo útil para crear una nueva instancia de la Hashtable clase que omite el caso de las cadenas. Sin embargo, todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable son sensibles a la cultura porque usan la propiedad Thread.CurrentCulture. No se puede crear algo insensible a la cultura Hashtable mediante este método. Para crear un Hashtable insensible a la cultura, use el constructor Hashtable que acepta un parámetro culture. Para el parámetro culture, especifique CultureInfo.InvariantCulture. El siguiente ejemplo de código muestra el constructor para un Hashtable independiente de la cultura.

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 SortedList

SortedList representa una colección de pares clave-valor ordenados por las claves y que son accesibles por clave y por índice. Cuando se usa un SortedList donde las cadenas son las claves, la ordenación y la búsqueda pueden verse afectadas por la Thread.CurrentCulture propiedad . Para obtener un comportamiento insensible a la cultura de SortedList, cree un SortedList mediante uno de los constructores que acepta un parámetro comparer. El comparer parámetro especifica la IComparer implementación que se va a usar al comparar claves. Para el parámetro , especifique una clase de comparador personalizada que use CultureInfo.InvariantCulture para comparar claves. En el ejemplo siguiente se muestra una clase de comparador sin distinción cultural personalizada que puede especificar como parámetro comparer para un SortedList constructor.

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

    internal InvariantComparer()
    {
        _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }

    public int Compare(Object a, Object b)
    {
        if (a is string sa && b is string sb)
            return _compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

En general, si utiliza un SortedList en cadenas sin especificar un comparador invariable personalizado, un cambio en Thread.CurrentCulture después de rellenar la lista podría invalidar la lista.

Uso del ArrayList.Sort método

Las sobrecargas del método ArrayList.Sort realizan ordenaciones que son sensibles a la cultura de forma predeterminada mediante la propiedad Thread.CurrentCulture. Los resultados pueden variar según la referencia cultural debido a diferentes criterios de ordenación. Para eliminar el comportamiento que tiene en cuenta las referencias culturales, use las sobrecargas de este método que aceptan una implementación IComparer. Para el comparer parámetro , especifique una clase de comparador invariable personalizada que use CultureInfo.InvariantCulture. En el tema Using the SortedList Class se proporciona un ejemplo de una clase de comparador invariable personalizada.

Consulte también