Tento článek je krátkou ukázkou použití slovníku a hashsetu, kde je hlavní hodnotou řetězec, u kterého chceme ignorovat velikost písmen. Takové chování může být výhodou v nespočtu případů.
Pokud si vytvoříme běžnou instanci slovníku nebo hashsetu, kde klíčem je string, lze přidávat různé kombinace velkých a malých písmen. Následující příklad vloží do slovníku a hashsetu 3 hodnoty. Ačkoliv jsou řetězce stejné, mají různou velikost písmen a proto se vloží záznamy vícekrát.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var dict = new Dictionary< string , int >();
dict[ "first" ] = 1;
dict[ "First" ] = 2;
dict[ "FIRST" ] = 3;
var hashSet = new HashSet< string >();
hashSet.Add( "first" );
hashSet.Add( "First" );
hashSet.Add( "FIRST" );
|
Pro použití case-insensitive chování použijeme explicitní comparer (doslovně - porovnávač). Ten je realizován jako samostatná třída. A její srovnávací funkce popisuje několik rozhraní:
- IComparer – porovnává dva objekty a výsledkem je jedna z možností: větší, menší, stejný
- IComparer<typ> – stejné jako IComparer, jen silně typový
- IEqualityComparer – porovnává, zda jsou objekty stejné nebo ne a navíc dokáže vypočítat hash instance (hash se používá k identifikaci objektu v Dictionary i HashSet)
- IEqualityComparer<string> – stejné jako IEqualityComparer, jen silně typový
Konkrétně použijeme jeden z comparerů typu StringComparer – slouží k porovnávání řetězců a implementuje všechny uvedené rozhraní. Já konkrétně většinou využívám variantu StringComparer.OrdinalIgnoreCase (velikost písmen nerozhoduje, diakritika ano).
Comparer lze předat v konstruktoru Dictionary i HashSetu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var dict = new Dictionary< string , int >(StringComparer.OrdinalIgnoreCase);
dict[ "first" ] = 1;
dict[ "First" ] = 2;
dict[ "FIRST" ] = 3;
var hashSet = new HashSet< string >(StringComparer.OrdinalIgnoreCase);
hashSet.Add( "first" );
hashSet.Add( "First" );
hashSet.Add( "FIRST" );
|
Ta samá ukázka pro Visual Basic .NET:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Dim dict As New Dictionary(Of String , Integer )(StringComparer.OrdinalIgnoreCase)
dict( "first" ) = 1
dict( "First" ) = 2
dict( "FIRST" ) = 3
Dim hashSet As New HashSet(Of String )(StringComparer.OrdinalIgnoreCase)
hashSet.Add( "first" )
hashSet.Add( "First" )
hashSet.Add( "FIRST" )
|