Cultuurgevoelige tekenreeksbewerkingen uitvoeren in verzamelingen
Er zijn klassen en leden in de System.Collections naamruimte die standaard cultuurgevoelig gedrag bieden. De parameterloze constructors voor de CaseInsensitiveComparer en CaseInsensitiveHashCodeProvider klassen initialiseren een nieuw exemplaar met behulp van de Thread.CurrentCulture eigenschap. Alle overbelastingen van de CollectionsUtil.CreateCaseInsensitiveHashtable methode maken standaard een nieuw exemplaar van de Hashtable klasse met behulp van de Thread.CurrentCulture
eigenschap. Overbelastingen van de ArrayList.Sort methode voeren standaard cultuurgevoelige sorteringen uit met behulp van Thread.CurrentCulture
. Sorteren en opzoeken in een SortedList bestand kan worden beïnvloed door Thread.CurrentCulture
tekenreeksen die als sleutels worden gebruikt. Volg de gebruiksaanbevelingen in deze sectie om cultuurgevoelige resultaten te verkrijgen van deze klassen en methoden in de Collections
naamruimte.
Notitie
Als u een vergelijkingsmethode doorgeeft CultureInfo.InvariantCulture , wordt een cultuurgevoelige vergelijking uitgevoerd. Het veroorzaakt echter geen niet-taalkundige vergelijking, bijvoorbeeld voor bestandspaden, registersleutels en omgevingsvariabelen. Het biedt ook geen ondersteuning voor beveiligingsbeslissingen op basis van het vergelijkingsresultaat. Voor een niet-taalkundige vergelijking of ondersteuning voor beveiligingsbeslissingen op basis van resultaten moet de toepassing een vergelijkingsmethode gebruiken die een StringComparison waarde accepteert. De toepassing moet vervolgens worden doorgegeven StringComparison.
CaseInsensitiveComparer
De en CaseInsensitiveHashCodeProvider
klassen gebruiken
De parameterloze constructors voor CaseInsensitiveHashCodeProvider
en CaseInsensitiveComparer
initialiseren een nieuw exemplaar van de klasse met behulp van het Thread.CurrentCulture
, wat resulteert in cultuurgevoelig gedrag. In het volgende codevoorbeeld wordt de constructor gedemonstreerd voor een Hashtable
constructor die cultuurgevoelig is omdat deze gebruikmaakt van de parameterloze constructors voor CaseInsensitiveHashCodeProvider
en CaseInsensitiveComparer
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Als u een cultuurgevoelig Hashtable
wilt maken met behulp van de CaseInsensitiveComparer
en CaseInsensitiveHashCodeProvider
klassen, initialiseert u nieuwe exemplaren van deze klassen met behulp van de constructors die een culture
parameter accepteren. Geef voor de culture
parameter op CultureInfo.InvariantCulture. In het volgende codevoorbeeld ziet u de constructor voor een cultuurgevoelige Hashtable
.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
CollectionsUtil.CreateCaseInsensitiveHashTable
De methode gebruiken
De CollectionsUtil.CreateCaseInsensitiveHashTable
methode is een handige snelkoppeling voor het maken van een nieuw exemplaar van de Hashtable
klasse die het geval van tekenreeksen negeert. Alle overbelastingen van de CollectionsUtil.CreateCaseInsensitiveHashTable
methode zijn echter cultuurgevoelig omdat ze de Thread.CurrentCulture
eigenschap gebruiken. U kunt geen cultuurgevoelige Hashtable
methode maken. Als u een cultuurgevoelige Hashtable
wilt maken, gebruikt u de Hashtable
constructor die een culture
parameter accepteert. Geef voor de culture
parameter op CultureInfo.InvariantCulture
. In het volgende codevoorbeeld ziet u de constructor voor een cultuurgevoelige Hashtable
.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
SortedList
De klasse gebruiken
A SortedList
vertegenwoordigt een verzameling sleutel-en-waardeparen die zijn gesorteerd op de sleutels en die toegankelijk zijn op sleutel en index. Wanneer u een SortedList
tekenreeks gebruikt waarbij tekenreeksen de sleutels zijn, kan de sorteer- en zoekactie worden beïnvloed door de Thread.CurrentCulture
eigenschap. Als u cultuurgevoelig gedrag wilt verkrijgen op basis van een SortedList
, maakt u een SortedList
met behulp van een van de constructors die een comparer
parameter accepteren. De comparer
parameter geeft de IComparer implementatie op die moet worden gebruikt bij het vergelijken van sleutels. Geef voor de parameter een aangepaste vergelijkingsklasse op die wordt gebruikt CultureInfo.InvariantCulture
om sleutels te vergelijken. In het volgende voorbeeld ziet u een aangepaste cultuurgevoelige vergelijkingsklasse die u kunt opgeven als parameter comparer
voor een 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);
}
}
Als u een SortedList
tekenreeks gebruikt zonder een aangepaste invariantvergelijker op te geven, kan een wijziging in Thread.CurrentCulture
nadat de lijst is ingevuld, de lijst ongeldig maken.
ArrayList.Sort
De methode gebruiken
Overbelastingen van de ArrayList.Sort
methode voeren standaard cultuurgevoelige sorteringen uit met behulp van de Thread.CurrentCulture
eigenschap. De resultaten kunnen variëren per cultuur vanwege verschillende sorteervolgordes. Als u cultuurgevoelig gedrag wilt elimineren, gebruikt u de overbelastingen van deze methode die een IComparer
implementatie accepteren. Geef voor de comparer
parameter een aangepaste invariant-vergelijkingsklasse op die gebruikmaakt van CultureInfo.InvariantCulture
. Een voorbeeld van een aangepaste invariant comparer-klasse wordt gegeven in het onderwerp Using the SortedList Class .