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

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

Poznámka

Předání metodě porovnání provádí porovnání bez CultureInfo.InvariantCulture rozlišení jazykové verze. Nezpůsobuje ale nelingvistické 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í. V případě nelingvistického porovnání nebo podpory rozhodnutí o zabezpečení na základě výsledků by aplikace měla použít metodu porovnání, která přijímá StringComparison hodnotu. Aplikace by pak měla předat StringComparison .

Použití CaseInsensitiveComparer tříd CaseInsensitiveHashCodeProvider a

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

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

Chcete-li vytvořit jazykovou verzi bez rozlišení pomocí tříd a , inicializovat nové instance těchto tříd pomocí Hashtable CaseInsensitiveComparer konstruktorů, které přijímají CaseInsensitiveHashCodeProvider culture parametr. Jako parametr culture zadejte CultureInfo.InvariantCulture . Následující příklad kódu ukazuje konstruktor pro jazykovou verzi bez rozlišení Hashtable .

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

Použití CollectionsUtil.CreateCaseInsensitiveHashTable metody

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

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

Použití SortedList třídy

Představuje kolekci párů klíč-hodnota, které jsou seřazené podle klíčů a jsou přístupné pomocí SortedList klíče a indexu. Pokud použijete klíče s řetězcem where, může být řazení a vyhledávání SortedList ovlivněno Thread.CurrentCulture vlastností . Chcete-li získat chování bez rozlišení jazykové verze z objektu , vytvořte pomocí jednoho z SortedList konstruktorů, které přijímají parametr SortedList comparer . Parametr comparer určuje implementaci, IComparer která 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 ukazuje vlastní porovnávací třídu bez rozlišení jazykové verze, kterou můžete zadat jako comparer parametr SortedList konstruktoru.

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 u řetězců bez zadání vlastního invariantního porovnávače, může změna na po naplnění seznamu zneplatnění SortedList Thread.CurrentCulture seznamu zneplatnění.

Použití ArrayList.Sort metody

Přetížení metody provádí ve výchozím nastavení řazení podle jazykové ArrayList.Sort verze pomocí Thread.CurrentCulture vlastnosti . Výsledky se můžou lišit podle jazykové verze z důvodu různých pořadí řazení. Chcete-li eliminovat chování citlivé na jazykovou verzi, použijte přetížení této metody, která přijímají IComparer implementaci. Pro parametr comparer 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 Použití třídy SortedList.

Viz také