Se ho un Dictionary<String,...>è possibile rendere metodi come ContainsKeymaiuscole 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 ContainsKeymaiuscole 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 IEqualityComparerche indichi al dizionario come confrontare le chiavi.
StringComparer.InvariantCultureIgnoreCaseti dà IEqualityComparerun'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")))
Anya SingleOrDefaultte non nulltornerai se non esiste, invece otterrai una coppia chiave di valore con chiave e valore impostati su null!
ContainsSembra un caso d'uso molto specifico di qualcosa su cui stavi lavorando in quel momento. Come risposta utile più generica, penso Equalssia 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 ...