Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.