Se ho un Dictionary<String,...>
è possibile rendere metodi come ContainsKey
maiuscole e minuscole?
Sembrava correlato, ma non l'ho capito bene: Dizionario c #: rendere il Key insensibile al maiuscolo / minuscolo attraverso le dichiarazioni
Se ho un Dictionary<String,...>
è possibile rendere metodi come ContainsKey
maiuscole e minuscole?
Sembrava correlato, ma non l'ho capito bene: Dizionario c #: rendere il Key insensibile al maiuscolo / minuscolo attraverso le dichiarazioni
Risposte:
Sembrava correlato, ma non l'ho capito bene: Dizionario c #: rendere il Key insensibile al maiuscolo / minuscolo attraverso le dichiarazioni
È effettivamente correlato. La soluzione è dire all'istanza del dizionario di non usare il metodo di confronto di stringhe standard (che fa distinzione tra maiuscole e minuscole) ma piuttosto di usare un metodo senza distinzione tra maiuscole e minuscole. Questo viene fatto usando il costruttore appropriato :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Il costruttore si aspetta uno IEqualityComparer
che indichi al dizionario come confrontare le chiavi.
StringComparer.InvariantCultureIgnoreCase
ti dà IEqualityComparer
un'istanza che confronta le stringhe in modo insensibile al maiuscolo / minuscolo.
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
Ci sono poche possibilità in cui il tuo affare con il dizionario viene estratto da terze parti o da una DLL esterna. Usando linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
a SingleOrDefault
te non null
tornerai se non esiste, invece otterrai una coppia chiave di valore con chiave e valore impostati su null
!
Contains
Sembra un caso d'uso molto specifico di qualcosa su cui stavi lavorando in quel momento. Come risposta utile più generica, penso Equals
sia meglio. E su quella stessa nota, invece di duplicare una stringa con ToLower()
, sarebbe ancora meglio usare StringComparison.xxxCase
.
dict.Keys.Contains("bla", appropriate comparer)
sovraccarico LINQ per facilità d'uso.
Ho appena incontrato lo stesso tipo di problema in cui avevo bisogno di un dizionario sensibile alle maiuscole / minuscole in un controller ASP.NET Core.
Ho scritto un metodo di estensione che fa il trucco. Forse questo può essere utile anche per gli altri ...
public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
foreach (var (key, value) in dictionary)
{
resultDictionary.Add(key, value);
}
dictionary = resultDictionary;
return dictionary;
}
Per utilizzare il metodo di estensione:
myDictionary.ConvertToCaseInSensitive();
Quindi ottieni un valore dal dizionario con:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
Se non hai alcun controllo nella creazione dell'istanza, supponiamo che il tuo oggetto sia desterilizzato da json ecc., Puoi creare una classe wrapper che eredita dalla classe del dizionario.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? Fa quello che dice ...