Eseguire operazioni sulle stringhe indipendenti dalle impostazioni cultura nelle raccolte
Nello spazio dei nomi System.Collections sono disponibili classi e membri che per impostazione predefinita forniscono un comportamento dipendente dalle impostazioni cultura. I costruttori senza parametri per le classi CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider inizializzano una nuova istanza tramite la proprietà Thread.CurrentCulture. Per impostazione predefinita, tutti gli overload del metodo CollectionsUtil.CreateCaseInsensitiveHashtable creano una nuova istanza della classe Hashtable tramite la proprietà Thread.CurrentCulture
. Per impostazione predefinita, gli overload del metodo ArrayList.Sort consentono di eseguire ordinamenti dipendenti dalle impostazioni cultura tramite Thread.CurrentCulture
. Ordinamento e ricerca in un SortedList possono essere influenzati dal Thread.CurrentCulture
quando vengono usate stringhe come chiavi. Per ottenere risultati indipendenti dalle impostazioni cultura da queste classi e da questi metodi dello spazio dei nomi Collections
, attenersi ai consigli sull'utilizzo forniti in questa sezione.
Nota
Il passaggio di CultureInfo.InvariantCulture a un metodo di confronto comporta l'esecuzione di un confronto non basato sulle impostazioni cultura. Non viene tuttavia eseguito un confronto non linguistico, ad esempio per percorsi di file, chiavi del Registro di sistema e variabili di ambiente e non sono supportate le decisioni relative alla sicurezza basate sul risultato del confronto. Per un confronto non linguistico o per il supporto delle decisioni relative alla sicurezza basate sul risultato, l'applicazione deve utilizzare un metodo di confronto che accetti un valore StringComparison. L'applicazione deve quindi passare StringComparison.
Usare invece le classi CaseInsensitiveComparer
e CaseInsensitiveHashCodeProvider
I costruttori senza parametri per CaseInsensitiveHashCodeProvider
e CaseInsensitiveComparer
inizializzano una nuova istanza della classe tramite Thread.CurrentCulture
, determinando così un comportamento dipendente dalle impostazioni cultura. Nell'esempio di codice seguente viene illustrato il costruttore per un oggetto Hashtable
dipendente dalle impostazioni cultura in quanto usa i costruttori senza parametri per CaseInsensitiveHashCodeProvider
e CaseInsensitiveComparer
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Per creare un oggetto Hashtable
non basato sulle impostazioni di cultura usando le classi CaseInsensitiveComparer
e CaseInsensitiveHashCodeProvider
, inizializzare nuove istanze di queste classi utilizzando costruttori che accettano un parametro culture
. Per il parametro culture
specificare CultureInfo.InvariantCulture. Nell'esempio di codice seguente viene illustrato il costruttore per un oggetto Hashtable
indipendente dalle impostazioni cultura.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Usare il metodo CollectionsUtil.CreateCaseInsensitiveHashTable
Il metodo CollectionsUtil.CreateCaseInsensitiveHashTable
rappresenta un rapido meccanismo per creare una nuova istanza della classe Hashtable
in cui viene ignorato l'uso di maiuscole e minuscole nelle stringhe. Tutti gli overload del metodo CollectionsUtil.CreateCaseInsensitiveHashTable
sono tuttavia dipendenti dalle impostazioni cultura in quanto utilizzano la proprietà Thread.CurrentCulture
. Con questo metodo non è possibile creare un oggetto Hashtable
indipendente dalle impostazioni cultura. Per creare un oggetto Hashtable
indipendente dalle impostazioni cultura, usare il costruttore di Hashtable
che accetta un parametro culture
. Per il parametro culture
specificare CultureInfo.InvariantCulture
. Nell'esempio di codice seguente viene illustrato il costruttore per un oggetto Hashtable
indipendente dalle impostazioni cultura.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Usare la classe SortedList
Un oggetto SortedList
rappresenta una raccolta di coppie chiave-valore ordinate in base alle chiavi e a cui è possibile accedere in base alla chiave e all'indice. Quando si utilizza un oggetto SortedList
in cui le chiavi sono costituite da stringhe, è possibile che la proprietà Thread.CurrentCulture
influisca sull'ordinamento e sulla ricerca. Per ottenere un comportamento indipendente dalle impostazioni cultura da un oggetto SortedList
, creare un oggetto SortedList
con uno dei costruttori che accetta un parametro comparer
. Il parametro comparer
specifica l'implementazione di IComparer da usare quando si confrontano le chiavi. Per il parametro, specificare una classe di operatori di confronto personalizzata che usi CultureInfo.InvariantCulture
per il confronto delle chiavi. Nell'esempio seguente viene illustrata una classe personalizzata di operatori di confronto indipendenti dalle impostazioni cultura che è possibile specificare come parametro comparer
per un costruttore di 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);
}
}
In generale, se si utilizza un oggetto SortedList
nelle stringhe senza specificare un operatore di confronto invariabile personalizzato, è possibile che l'elenco venga invalidato da una modifica apportata a Thread.CurrentCulture
dopo che vi sono state inserite voci.
Usare il metodo ArrayList.Sort
Per impostazione predefinita, gli overload del metodo ArrayList.Sort
consentono di eseguire ordinamenti dipendenti dalle impostazioni cultura tramite la proprietà Thread.CurrentCulture
. I risultati possono variare in base alle impostazioni cultura, a causa di diversi criteri di ordinamento. Per eliminare il comportamento dipendente dalle impostazioni cultura, utilizzare gli overload del metodo che accettano un'implementazione di IComparer
. Per il parametro comparer
, specificare una classe di operatori di confronto invariabili personalizzati che usi CultureInfo.InvariantCulture
. Per un esempio di classe di questo tipo, vedere l'argomento Utilizzo della classe SortedList.