Realizar operaciones de cadenas que no tienen en cuenta las referencias culturales en colecciones
Actualización: noviembre 2007
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. 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 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 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. Para el parámetro culture, especifique CultureInfo.InvariantCulture. 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 para 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
CaseInsensitiveHashCodeProvider
CollectionsUtil.CreateCaseInsensitiveHashTable (Método)
Otros recursos
Realizar operaciones de cadenas que no distinguen entre referencias culturales