Kultúraérzékeny sztringműveletek végrehajtása gyűjteményekben
A névtérben System.Collections vannak olyan osztályok és tagok, amelyek alapértelmezés szerint kulturális szempontból érzékeny viselkedést biztosítanak. Az és CaseInsensitiveHashCodeProvider az CaseInsensitiveComparer osztályok paraméter nélküli konstruktorai inicializálnak egy új példányt a Thread.CurrentCulture tulajdonság használatával. A metódus minden túlterhelése CollectionsUtil.CreateCaseInsensitiveHashtable alapértelmezés szerint létrehoz egy új osztálypéldányt a Thread.CurrentCulture
Hashtable tulajdonság használatával. A metódus túlterhelései ArrayList.Sort alapértelmezés szerint kulturális szempontból érzékeny rendezéseket végeznek a használatával Thread.CurrentCulture
. A rendezést és a keresést SortedList befolyásolhatja Thread.CurrentCulture
a sztringek kulcsként való használata. Kövesse az ebben a szakaszban található használati javaslatokat, hogy a névtérben található osztályok és metódusok Collections
kulturális szempontból nem érzéketlen eredményeket szerezzenek.
Feljegyzés
Az összehasonlítási módszernek való CultureInfo.InvariantCulture továbbítás nem végez kulturális érzéketlen összehasonlítást. Ez azonban nem okoz nem nyelvi összehasonlítást, például fájlelérési utak, beállításkulcsok és környezeti változók esetében. Az összehasonlítási eredmény alapján hozott biztonsági döntéseket sem támogatja. A nem nyelvi összehasonlításhoz vagy az eredményalapú biztonsági döntések támogatásához az alkalmazásnak olyan összehasonlító módszert kell használnia, amely elfogadja az StringComparison értéket. Az alkalmazásnak ezután át kell adnia StringComparison.
Az és CaseInsensitiveHashCodeProvider
az CaseInsensitiveComparer
osztályok használata
Az osztály új példányának paraméter nélküli konstruktorai CaseInsensitiveHashCodeProvider
és CaseInsensitiveComparer
inicializálása a Thread.CurrentCulture
kultúrkultúra szempontjából érzékeny viselkedést eredményez. Az alábbi példakód egy kulturális szempontból érzékeny konstruktor konstruktorát Hashtable
mutatja be, mert a paraméter nélküli konstruktorokat használja az és CaseInsensitiveComparer
a CaseInsensitiveHashCodeProvider
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Ha kulturális érzéketlent Hashtable
szeretne létrehozni az és CaseInsensitiveHashCodeProvider
az CaseInsensitiveComparer
osztályok használatával, inicializálja ezeknek az osztályoknak az új példányait a paramétereket elfogadó culture
konstruktorokkal. A paraméterhez adja meg a culture
következőt CultureInfo.InvariantCulture: . Az alábbi példakód egy kultúraérzékeny Hashtable
konstruktorát mutatja be.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
CollectionsUtil.CreateCaseInsensitiveHashTable
A metódus használata
A CollectionsUtil.CreateCaseInsensitiveHashTable
metódus hasznos parancsikon az osztály új példányának Hashtable
létrehozásához, amely figyelmen kívül hagyja a sztringek esetét. A metódus minden túlterhelése CollectionsUtil.CreateCaseInsensitiveHashTable
azonban kulturális szempontból érzékeny, mert a tulajdonságot Thread.CurrentCulture
használják. Ezzel a módszerrel nem hozhat létre kultúraérzékenyet Hashtable
. Kultúraérzékenység Hashtable
létrehozásához használja a Hashtable
paramétert elfogadó konstruktort culture
. A paraméterhez adja meg a culture
következőt CultureInfo.InvariantCulture
: . Az alábbi példakód egy kultúraérzékeny Hashtable
konstruktorát mutatja be.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Az SortedList
osztály használata
Az A SortedList
kulcs- és értékpárok gyűjteményét jelöli, amelyek a kulcsok szerint vannak rendezve, és kulcs és index alapján érhetők el. Ha sztringeket SortedList
használ a kulcsok között, a rendezést és a keresést befolyásolhatja a Thread.CurrentCulture
tulajdonság. Ha kultúraérzékeny viselkedést szeretne lekötni egy SortedList
adott konstruktorból, hozzon létre egy SortedList
paramétert elfogadó konstruktort comparer
. A comparer
paraméter meghatározza a IComparer kulcsok összehasonlítása során használni kívánt implementációt. A paraméterhez adjon meg egy egyéni összehasonlító osztályt, amely a kulcsok összehasonlítására használható CultureInfo.InvariantCulture
. Az alábbi példa egy egyéni kultúra-érzéketlen összehasonlító osztályt mutat be, amelyet paraméterként adhat meg egy comparer
SortedList
konstruktor számára.
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);
}
}
Általánosságban elmondható, hogy ha egyéni invariáns összehasonlító megadása nélkül használ SortedList
sztringeket, a lista feltöltése utáni módosítás Thread.CurrentCulture
érvénytelenítheti a listát.
ArrayList.Sort
A metódus használata
A metódus túlterhelései ArrayList.Sort
alapértelmezés szerint kulturális szempontból érzékeny rendezéseket hajtanak végre a Thread.CurrentCulture
tulajdonság használatával. Az eredmények kultúránként eltérőek lehetnek a különböző rendezési sorrendek miatt. A kultúraérzékeny viselkedés megszüntetéséhez használja ennek a metódusnak a túlterheléseit, amelyek implementációt IComparer
fogadnak el. comparer
A paraméterhez adjon meg egy egyéni invariáns összehasonlító osztályt, amely a függvényt használjaCultureInfo.InvariantCulture
. Az egyéni invariáns összehasonlító osztályra a Rendezéslista osztály témakör nyújt példát.