Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

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, de forma predeterminada, proporcionan un comportamiento que tiene en cuenta las referencias culturales. Los constructores predeterminados de las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider inicializan una nueva instancia mediante la propiedad Thread.CurrentCulture. De forma predeterminada, todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable crean una nueva instancia de la clase Hashtable mediante la propiedad Thread.CurrentCulture. De forma predeterminada, las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta la referencia cultural mediante la propiedad Thread.CurrentCulture. La propiedad Thread.CurrentCulture puede afectar a la ordenación y la búsqueda en un objeto SortedList cuando se utilizan cadenas como claves. Siga las recomendaciones de uso proporcionadas en esta sección para obtener resultados que no tengan en cuenta la referencia cultural de estos métodos y clases en el espacio de nombres Collections.

Nota   Al pasar CultureInfo.InvariantCulture a un método de comparación, se realiza una comparación que no tiene en cuenta la referencia cultural. Sin embargo, no se realiza una comparación no lingüística, por ejemplo, para las rutas de acceso a archivos, las claves del Registro y las variables de entorno. Tampoco se admiten decisiones de seguridad basadas en el resultado de la comparación. Para que se realice una comparación no lingüística o se admitan decisiones de seguridad basadas en los resultados, la aplicación debe usar un método de comparación que acepte un valor de StringComparison. A continuación, la aplicación debe pasar Ordinal.

Los constructores predeterminados de CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer inicializan una nueva instancia de la clase mediante Thread.CurrentCulture, lo cual da lugar a un comportamiento que tiene en cuenta la referencia cultural. En el ejemplo de código siguiente, se muestra el constructor de una clase Hashtable que es dependiente de la referencia cultural porque utiliza los constructores predeterminados de CaseInsensitiveHashCodeProvider y CaseInsensitiveComparer.

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

Si desea crear una nueva clase Hashtable que no tenga en cuenta la referencia cultural usando las clases CaseInsensitiveComparer y CaseInsensitiveHashCodeProvider, inicialice nuevas instancias de estas clases mediante constructores que acepten un parámetro culture. Para el parámetro culture, especifique CultureInfo.InvariantCulture. En el siguiente ejemplo de código, se muestra el constructor de una clase Hashtable que no tiene en cuenta la referencia cultural.

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

El método CollectionsUtil.CreateCaseInsensitiveHashTable es un acceso directo útil para crear una nueva instancia de la clase Hashtable que omita el uso de mayúsculas y minúsculas en las cadenas. Sin embargo, todas las sobrecargas del método CollectionsUtil.CreateCaseInsensitiveHashTable tienen en cuenta la referencia cultural porque usan la propiedad Thread.CurrentCulture. Con este método, no se puede crear una Hashtable que no tenga en cuenta la referencia cultural. Para crear una Hashtable que no tenga en cuenta la referencia cultural, use el constructor de Hashtable que acepte un parámetro culture. Para el parámetro culture, especifique CultureInfo.InvariantCulture. En el siguiente ejemplo de código, se muestra el constructor de una clase Hashtable que no tiene en cuenta la referencia cultural.

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

Una clase SortedList representa una colección de pares clave-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 clase SortedList donde las cadenas son las claves, la ordenación y la búsqueda pueden verse afectadas por la propiedad Thread.CurrentCulture. Para que una clase SortedList tenga un comportamiento independiente de la referencia cultural, cree un objeto SortedList mediante 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 para comparar las claves. Para el parámetro, especifique una clase comparadora personalizada que utilice CultureInfo.InvariantCulture para comparar las claves. En el ejemplo siguiente, se muestra una clase comparadora personalizada e independiente de la referencia cultural que se puede especificar como el parámetro comparer de un constructor de SortedList.

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 se usa un objeto SortedList con cadenas sin especificar un comparador invariable personalizado, cualquier cambio que se realice en Thread.CurrentCulture después de que se haya rellenado la lista puede invalidar dicha lista.

De forma predeterminada, las sobrecargas del método ArrayList.Sort realizan ordenaciones que tienen en cuenta la referencia cultural mediante la propiedad Thread.CurrentCulture. Los resultados pueden cambiar en función de las referencias culturales debido a los diferentes criterios de ordenación. Para que el comportamiento no tenga en cuenta la referencia cultural, use las sobrecargas de este método que acepten una implementación de IComparer. Para el parámetro comparer, especifique una clase comparadora invariable personalizada que use CultureInfo.InvariantCulture. Se proporciona un ejemplo de clase comparadora invariable personalizada en el tema Utilizar la clase SortedList.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft