Si j'ai un Dictionary<String,...>
est-il possible de faire des méthodes comme la ContainsKey
casse insensible?
Cela semblait lié, mais je ne l'ai pas bien compris: c # Dictionary: rendre la clé insensible à la casse grâce aux déclarations
Si j'ai un Dictionary<String,...>
est-il possible de faire des méthodes comme la ContainsKey
casse insensible?
Cela semblait lié, mais je ne l'ai pas bien compris: c # Dictionary: rendre la clé insensible à la casse grâce aux déclarations
Réponses:
Cela semblait lié, mais je ne l'ai pas bien compris: c # Dictionary: rendre la clé insensible à la casse grâce aux déclarations
C'est en effet lié. La solution est de dire à l'instance de dictionnaire de ne pas utiliser la méthode standard de comparaison de chaînes (qui est sensible à la casse) mais plutôt d'utiliser une méthode insensible à la casse. Cela se fait en utilisant le constructeur approprié :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Le constructeur attend un IEqualityComparer
qui indique au dictionnaire comment comparer les clés.
StringComparer.InvariantCultureIgnoreCase
vous donne une IEqualityComparer
instance qui compare les chaînes de manière insensible à la casse.
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
Il y a peu de chances que votre affaire avec un dictionnaire qui est extrait d'une DLL tierce ou externe. Utilisation de linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
en, SingleOrDefault
vous ne reviendrez pas null
s'il n'existe pas, vous obtiendrez à la place une paire de valeurs clés avec la clé et la valeur définies sur null
!
Contains
Cela semble être un cas d'utilisation très spécifique à quelque chose sur lequel vous travailliez à l'époque. En tant que réponse utile plus générique, je pense que Equals
c'est mieux. Et sur cette même note, au lieu de dupliquer une chaîne avec ToLower()
, il serait encore mieux de l'utiliser StringComparison.xxxCase
.
dict.Keys.Contains("bla", appropriate comparer)
surcharge LINQ pour faciliter l'utilisation.
Je viens de rencontrer le même genre de problème où j'avais besoin d'un dictionnaire sensible à la casse dans un contrôleur ASP.NET Core.
J'ai écrit une méthode d'extension qui fait l'affaire. Peut-être que cela peut également être utile pour les autres ...
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;
}
Pour utiliser la méthode d'extension:
myDictionary.ConvertToCaseInSensitive();
Ensuite, récupérez une valeur du dictionnaire avec:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
Si vous n'avez aucun contrôle sur la création de l'instance, disons que votre objet est déstérilisé de json, etc., vous pouvez créer une classe wrapper qui hérite de la classe de dictionnaire.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? Il fait ce qu'il dit ...