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í Hashtable
jazykovou 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 .