Provádění operací s řetězci v kolekcích nezávisle na jazykové verzi
V oboru názvů System.Collections existují třídy a členy, které ve výchozím nastavení poskytují chování zohledňující jazykovou verzi. Výchozí konstruktory pro třídy CaseInsensitiveComparer a CaseInsensitiveHashCodeProvider inicializují nové instance pomocí vlastnosti Thread.CurrentCulture. Všechny přetížení metody CollectionsUtil.CreateCaseInsensitiveHashTable ve výchozím nastavení vytváří nové instance třídy Hashtable použitím vlastnosti Thread.CurrentCulture. Přetížení metody ArrayList.Sort ve výchozím nastavení provádí řazení zohledňující jazykovou verzi s užitím Thread.CurrentCulture. Řazení a vyhledávání v SortedList může být ovlivněno vlastností Thread.CurrentCulture, pokud jsou jako klíče použity řetězce. Postupujte podle doporučení poskytnutých v tomto oddíle pro získání výsledků nezávislých na jazykové verzi z těchto tříd a metod v oboru názvů Collections.
Poznámka Předáním CultureInfo.InvariantCulture metodě pro porovnávání bude provedeno porovnání nezohledňující jazykovou verzi. Ovšem není tak provedeno nelingvistické porovnání například pro cesty souborů, klíče registru a proměnné prostředí. Ani rozhodnutí o zabezpečení není podporováno na základě výsledků tohoto porovnání. Pro nelingvistické porovnání nebo podporu rozhodnutí o zabezpečení založeném na výsledku porovnání by aplikace měla používat metodu pro porovnávání, která přijímá hodnotu StringComparison. Aplikace by pak měla předat Ordinal.
Použití tříd CaseInsensitiveComparer a CaseInsensitiveHashCodeProvider
Výchozí konstruktory pro CaseInsensitiveHashCodeProvider a CaseInsensitiveComparer inicializují novou instanci třídy s užitím Thread.CurrentCulture, což má za následek chování zohledňující jazykovou verzi. Následující příklad kódu ukazuje konstruktor pro Hashtable, který zohledňuje jazykovou verzi, protože používá výchozí konstruktory pro CaseInsensitiveHashCodeProvider a CaseInsensitiveComparer.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Pokud má být použitím tříd CaseInsensitiveComparer a CaseInsensitiveHashCodeProvider vytvořena instance třídy Hashtable , je potřeba inicializovat nové instance těchto tříd pomocí konstruktorů, které přijímají parametr culture. Parametru culture je pak potřeba předat CultureInfo.InvariantCulture. Následující příklad kódu ukazuje konstruktor pro třídu Hashtable, která nezohledňuje jazykovou verzi.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Použití metody CollectionsUtil.CreateCaseInsensitiveHashTable
Metoda CollectionsUtil.CreateCaseInsensitiveHashTable je užitečnou zkratkou pro vytvoření nové instance třídy Hashtable, která bude ignorovat velikost písmen řetězců. Nicméně všechna přetížení metody CollectionsUtil.CreateCaseInsensitiveHashTable zohledňují jazykovou verzi, protože používají vlastnost Thread.CurrentCulture. Pomocí této metody nelze vytvořit instanci Hashtable, která je nezávislá na jazykové verzi. Pro vytvoření instance Hashtable nezávislé na jazykové verzi lze použít konstruktor Hashtable, který přijímá parametr culture. Parametru culture je pak potřeba předat CultureInfo.InvariantCulture. Následující příklad kódu ukazuje konstruktor pro třídu Hashtable, která nezohledňuje jazykovou verzi.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Použití třídy SortedList
SortedList představuje kolekci dvojic klíč a hodnota, které jsou seřazeny podle klíče a jsou přístupné prostřednictvím klíče a indexu. Pokud jsou při použití SortedList klíči řetězce, řazení a vyhledávání může být ovlivněno vlastností Thread.CurrentCulture. Pokud se má SortedList chovat nezávisle na jazykové verzi, je potřeba vytvořit SortedList pomocí jednoho z konstruktorů, které přijímají parametr comparer. Parametr comparer určuje implementaci IComparer, která má být použita při porovnání klíčů. Jako parametr lze zadat vlastní třídu pro porovnávání, která používá CultureInfo.InvariantCulture pro porovnávání klíčů. Následující příklad ukazuje vlastní třídu pro porovnávání, která je nezávislá na jazykové verzi, kterou lze zadat jako parametr comparer konstruktoru SortedList.
Imports System
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 m_compareInfo;
internal static readonly InvariantComparer Default = new
InvariantComparer();
internal InvariantComparer()
{
m_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
}
public int Compare(Object a, Object b)
{
String sa = a as String;
String sb = b as String;
if (sa != null && sb != null)
return m_compareInfo.Compare(sa, sb);
else
return Comparer.Default.Compare(a,b);
}
}
Obecně platí, že pokud je použit SortedList s řetězci bez určení vlastního invariantního porovnávání, pak změna Thread.CurrentCulture po naplnění seznamu může tento seznam znehodnotit.
Použití metody ArrayList.Sort
Přetížení metody ArrayList.Sort ve výchozím nastavení provádí řazení zohledňující jazykovou verzi s užitím vlastnosti Thread.CurrentCulture. Výsledky se mohou v různých jazykových verzích lišit kvůli odlišnému pořadí řazení. Chcete-li vyloučit chování zohledňující jazykovou verzi, použijte přetížení této metody, které přijímá implementaci IComparer. Parametru comparer předejte vlastní třídu pro invariantní porovnávání, která používá CultureInfo.InvariantCulture. Příklad vlastní třídy pro invariantní porovnávání je k dispozici v tématu Použití třídy SortedList.
Viz také
Odkaz
CaseInsensitiveHashCodeProvider
Metoda CollectionsUtil.CreateCaseInsensitiveHashTable
Další zdroje
Provádění operací s řetězci, které jsou nezávislé na jazykové verzi