Esecuzione di operazioni sulle stringhe indipendenti dalla lingua negli insiemi
Aggiornamento: novembre 2007
Nello spazio dei nomi System.Collections sono disponibili classi e membri che per impostazione predefinita forniscono un comportamento dipendente dalle impostazioni cultura. I costruttori predefiniti per le classi CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider inizializzano una nuova istanza mediante la proprietà Thread.CurrentCulture. Per impostazione predefinita, in tutti gli overload del metodo CollectionsUtil.CreateCaseInsensitiveHashTable viene creata una nuova istanza della classe Hashtable utilizzando la proprietà Thread.CurrentCulture. Per impostazione predefinita, gli overload del metodo ArrayList.Sort consentono di eseguire ordinamenti dipendenti dalle impostazioni cultura utilizzando la proprietà Thread.CurrentCulture. Se le stringhe vengono utilizzate come chiavi, la proprietà Thread.CurrentCulture può influire sulle operazioni di ordinamento e ricerca in un oggetto SortedList. Per ottenere risultati indipendenti dalle impostazioni cultura da queste classi e da questi metodi dello spazio dei nomi Collections, attenersi alle avvertenze sull'utilizzo fornite in questa sezione.
Utilizzo delle classi CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider
Mediante i costruttori predefiniti per CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer, una nuova istanza della classe viene inizializzata utilizzando Thread.CurrentCulture e determinando così un comportamento dipendente dalle impostazioni cultura. Nell'esempio di codice riportato di seguito viene illustrato il costruttore per un Hashtable che risulta dipendente dalle impostazioni cultura, poiché utilizza i costruttori predefiniti per CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Per creare un Hashtable indipendente dalle impostazioni cultura mediante le classi CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider, inizializzare nuove istanze di queste classi utilizzando i costruttori che accettano un parametro culture. Specificare CultureInfo.InvariantCulture per il parametro culture. Nel codice riportato di seguito viene illustrato il costruttore per un 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));
Utilizzo del metodo CollectionsUtil.CreateCaseInsensitiveHashTable
Il metodo CollectionsUtil.CreateCaseInsensitiveHashTable rappresenta un rapido meccanismo per creare una nuova istanza della classe Hashtable in cui viene ignorata la combinazione di maiuscole e minuscole delle stringhe. Tutti gli overload del metodo CollectionsUtil.CreateCaseInsensitiveHashTable, tuttavia, sono dipendenti dalle impostazioni cultura, poiché utilizzano la proprietà Thread.CurrentCulture. Mediante questo metodo non è possibile creare un Hashtable indipendente dalle impostazioni cultura. Per creare un Hashtable indipendente dalle impostazioni cultura, utilizzare il costruttore di Hashtable che accetta un parametro culture. Per il parametro culture, specificare CultureInfo.InvariantCulture. Nel codice riportato di seguito viene illustrato il costruttore per un 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));
Utilizzo della classe SortedList
Una classe SortedList rappresenta un insieme di coppie chiave-valore ordinate in base alle chiavi e a cui è possibile accedere in base alla chiave e all'indice. Quando viene utilizzata una classe SortedList in cui le chiavi sono costituite da stringhe, è possibile che la proprietà Thread.CurrentCulture influisca sull'ordinamento e la ricerca. Per ottenere un comportamento indipendente dalle impostazioni cultura da una classe SortedList, creare una classe SortedList utilizzando uno dei costruttori che accetta un parametro comparer. Il parametro comparer specifica l'implementazione di IComparer da utilizzare nel confronto delle chiavi. Per il parametro IComparer, specificare una classe di operatori di confronto personalizzati che utilizza la proprietà CultureInfo.InvariantCulture per il confronto delle chiavi. Nell'esempio riportato di seguito viene illustrata una classe di operatori di confronto indipendenti dalle impostazioni cultura e personalizzati che è possibile specificare come parametro IComparer per un costruttore di 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);
}
}
In generale, se una classe SortedList viene utilizzata con stringhe senza specificare un operatore di confronto invariabile personalizzato, è possibile che l'elenco venga invalidato da una modifica apportata a Thread.CurrentCulture dopo l'inserimento di dati nell'elenco.
Utilizzo del metodo ArrayList.Sort
Per impostazione predefinita, mediante gli overload del metodo ArrayList.Sort vengono eseguiti ordinamenti dipendenti dalle impostazioni cultura utilizzando 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 parametro IComparer. Per il parametro IComparer specificare una classe di operatori di confronto invariabili personalizzati che utilizza la proprietà CultureInfo.InvariantCulture. Per un esempio di classe di questo tipo, vedere l'argomento Utilizzo della classe SortedList.
Vedere anche
Riferimenti
CaseInsensitiveHashCodeProvider
Metodo CollectionsUtil.CreateCaseInsensitiveHashTable
Altre risorse
Esecuzione di operazioni sulle stringhe indipendenti dalla lingua