Provádění operací řetězců bez rozlišení jazykové verze v kolekcích

Obor názvů má třídy a členy System.Collections , které ve výchozím nastavení poskytují chování citlivé na jazykovou verzi. Konstruktory bez parametrů pro CaseInsensitiveComparer třídy CaseInsensitiveHashCodeProvider inicializují novou instanci pomocí Thread.CurrentCulture vlastnosti. Všechna přetížení CollectionsUtil.CreateCaseInsensitiveHashtable metody vytvoří novou instanci Hashtable třídy pomocí Thread.CurrentCulture vlastnosti ve výchozím nastavení. ArrayList.Sort Přetížení metody provádí řazení citlivá na jazykovou verzi ve výchozím nastavení pomocí Thread.CurrentCulture. Řazení a vyhledávání v řetězci SortedList může být ovlivněno Thread.CurrentCulture , když se řetězce používají jako klíče. Pokud chcete získat výsledky nerozlišující jazykové verze z těchto tříd a metod v Collections oboru názvů, postupujte podle doporučení použití uvedených v této části.

Poznámka:

Předání CultureInfo.InvariantCulture do metody porovnání provádí porovnání bez rozlišení jazykové verze. Nezpůsobí ale jazykové porovnání, například pro cesty k souborům, klíče registru a proměnné prostředí. Ani to nepodporuje rozhodnutí o zabezpečení na základě výsledku porovnání. Pro nejazyčné porovnání nebo podporu rozhodnutí o zabezpečení na základě výsledků by aplikace měla použít metodu StringComparison porovnání, která přijímá hodnotu. Aplikace by pak měla předat StringComparison.

Použití tříd CaseInsensitiveComparer a CaseInsensitiveHashCodeProvider

Konstruktory bez parametrů pro CaseInsensitiveHashCodeProvider a CaseInsensitiveComparer inicializují novou instanci třídy pomocí Thread.CurrentCulture, což vede k chování citlivé na jazykovou verzi. Následující příklad kódu ukazuje konstruktor pro Hashtable , který je citlivý na jazykovou verzi, protože používá konstruktory bez parametrů pro CaseInsensitiveHashCodeProvider a CaseInsensitiveComparer.

internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

Pokud chcete vytvořit nerozlišující Hashtable jazykovou verzi pomocí CaseInsensitiveComparer tříd a CaseInsensitiveHashCodeProvider tříd, inicializovat nové instance těchto tříd pomocí konstruktorů, které přijímají culture parametr. culture Pro parametr zadejte CultureInfo.InvariantCulture. Následující příklad kódu ukazuje konstruktor pro jazykovou verzi nerozlišující 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 Použití metody

Metoda CollectionsUtil.CreateCaseInsensitiveHashTable je užitečná zkratka pro vytvoření nové instance Hashtable třídy, která ignoruje případ řetězců. Všechna přetížení CollectionsUtil.CreateCaseInsensitiveHashTable metody jsou však citlivá na jazykovou verzi, protože používají Thread.CurrentCulture vlastnost. Pomocí této metody nelze vytvořit nerozlišující Hashtable jazykovou verzi. Chcete-li vytvořit nerozlišující Hashtablejazykovou verzi , použijte Hashtable konstruktor, který přijímá culture parametr. culture Pro parametr zadejte CultureInfo.InvariantCulture. Následující příklad kódu ukazuje konstruktor pro jazykovou verzi nerozlišující Hashtable.

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

SortedList Použití třídy

A SortedList představuje kolekci párů klíč-hodnota seřazených podle klíčů a jsou přístupné podle klíče a indexu. Pokud použijete, kde SortedList řetězce jsou klíče, může být řazení a vyhledávání ovlivněno Thread.CurrentCulture vlastností. Chcete-li získat chování nerozlišující jazykovou verzi z objektu SortedList, vytvořte SortedList pomocí jednoho z konstruktorů, které přijímá comparer parametr. Parametr comparer určuje implementaci, která IComparer se má použít při porovnávání klíčů. Pro parametr zadejte vlastní porovnávací třídu, která používá CultureInfo.InvariantCulture k porovnání klíčů. Následující příklad znázorňuje vlastní třídu porovnání nerozlišující jazykovou verzi, kterou můžete zadat jako comparer parametr konstruktoru SortedList .

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);
    }
}

Obecně platí, že pokud použijete SortedList u řetězců bez zadání vlastního invariantní porovnávače, může změna po Thread.CurrentCulture naplnění seznamu zneplatnit seznam.

ArrayList.Sort Použití metody

ArrayList.Sort Přetížení metody provádí řazení citlivá na jazykovou verzi ve výchozím nastavení pomocí Thread.CurrentCulture vlastnosti. Výsledky se můžou lišit podle jazykové verze kvůli různým pořadím řazení. Chcete-li eliminovat chování citlivé na jazykovou verzi, použijte přetížení této metody, které přijímají implementaci IComparer . comparer Pro parametr zadejte vlastní invariantní porovnávací třídu, která používá CultureInfo.InvariantCulture. Příklad vlastní invariantní porovnávací třídy je k dispozici v tématu Using the SortedList Class .

Viz také