Dela via


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.CurrentCultureav , 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 Hashtableanvä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 SortedListskapar 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.SortThread.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 .

Se även