Utföra kulturokänsliga strängåtgärder i samlingar
Det finns klasser och medlemmar i System.Collections namnområdet som tillhandahåller kulturkänsligt beteende som standard. De parameterlösa konstruktorerna för CaseInsensitiveComparer klasserna och CaseInsensitiveHashCodeProvider initierar en ny instans med hjälp av Thread.CurrentCulture egenskapen . Alla överlagringar av CollectionsUtil.CreateCaseInsensitiveHashtable metoden skapar en ny instans av Hashtable klassen med egenskapen Thread.CurrentCulture
som standard. Överlagringar av ArrayList.Sort metoden utför kulturkänsliga sorter som standard med hjälp av Thread.CurrentCulture
. Sortering och sökning i en SortedList kan påverkas av Thread.CurrentCulture
när strängar används som nycklar. Följ användningsrekommendationerna i det här avsnittet för att hämta kulturokänsliga resultat från dessa klasser och metoder i Collections
namnområdet.
Kommentar
Att skicka CultureInfo.InvariantCulture till en jämförelsemetod utför en kulturokänslig jämförelse. Det orsakar dock ingen icke-språklig jämförelse, till exempel för filsökvägar, registernycklar och miljövariabler. Det stöder inte heller säkerhetsbeslut baserat på jämförelseresultatet. För en icke-språklig jämförelse eller stöd för resultatbaserade säkerhetsbeslut bör programmet använda en jämförelsemetod som accepterar ett StringComparison värde. Programmet bör sedan skicka StringComparison.
Använda klasserna CaseInsensitiveComparer
och CaseInsensitiveHashCodeProvider
De parameterlösa konstruktorerna för CaseInsensitiveHashCodeProvider
och CaseInsensitiveComparer
initierar en ny instans av klassen med hjälp Thread.CurrentCulture
av , vilket resulterar i kulturkänsligt beteende. Följande kodexempel visar konstruktorn för en Hashtable
som är kulturkänslig eftersom den använder de parameterlösa konstruktorerna för CaseInsensitiveHashCodeProvider
och CaseInsensitiveComparer
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Om du vill skapa en kulturokänslig Hashtable
med klasserna CaseInsensitiveComparer
och CaseInsensitiveHashCodeProvider
initierar du nya instanser av dessa klasser med hjälp av konstruktorerna som accepterar en culture
parameter. För parametern culture
anger du CultureInfo.InvariantCulture. Följande kodexempel visar konstruktorn för en kulturokänslig 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
Använda metoden
Metoden CollectionsUtil.CreateCaseInsensitiveHashTable
är en användbar genväg för att skapa en ny instans av Hashtable
klassen som ignorerar fallet med strängar. Alla överlagringar av CollectionsUtil.CreateCaseInsensitiveHashTable
metoden är dock kulturkänsliga eftersom de använder Thread.CurrentCulture
egenskapen . Du kan inte skapa en kulturokänslig Hashtable
med den här metoden. Om du vill skapa en kulturokänslig Hashtable
använder du Hashtable
konstruktorn som accepterar en culture
parameter. För parametern culture
anger du CultureInfo.InvariantCulture
. Följande kodexempel visar konstruktorn för en kulturokänslig Hashtable
.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
SortedList
Använda klassen
A SortedList
representerar en samling nyckel-och-värde-par som sorteras efter nycklarna och är tillgängliga efter nyckel och index. När du använder en SortedList
där strängar är nycklarna kan sortering och sökning påverkas av Thread.CurrentCulture
egenskapen. Om du vill hämta kulturokänsligt beteende från en SortedList
skapar du en SortedList
med någon av konstruktorerna som accepterar en comparer
parameter. Parametern comparer
anger den implementering som IComparer ska användas vid jämförelse av nycklar. För parametern anger du en anpassad jämförelseklass som använder CultureInfo.InvariantCulture
för att jämföra nycklar. I följande exempel visas en anpassad kulturokänslig jämförelseklass som du kan ange som parameter till comparer
en SortedList
konstruktor.
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);
}
}
Om du i allmänhet använder en SortedList
på strängar utan att ange en anpassad invariant jämförelse kan en ändring Thread.CurrentCulture
av när listan har fyllts i ogiltigförklara listan.
ArrayList.Sort
Använda metoden
Överlagringar av metoden utför kulturkänsliga sorter som standard med hjälp av ArrayList.Sort
Thread.CurrentCulture
egenskapen . Resultaten kan variera beroende på kultur på grund av olika sorteringsordningar. Om du vill eliminera kulturkänsligt beteende använder du överlagringarna för den här metoden som accepterar en IComparer
implementering. För parametern comparer
anger du en anpassad invariant jämförelseklass som använder CultureInfo.InvariantCulture
. Ett exempel på en anpassad invariant jämförelseklass finns i avsnittet Använda klassen SortedList .