Jeśli mam a, Dictionary<String,...>
czy jest możliwe, aby metody takie jak nie ContainsKey
uwzględniały wielkości liter?
Wydawało się, że jest to powiązane, ale nie zrozumiałem tego poprawnie: Słownik c #: sprawianie, że klucz nie uwzględnia wielkości liter poprzez deklaracje
c#
collections
generic-collections
Mr. Boy
źródło
źródło
StringComparer.InvariantCultureIgnoreCase
? Robi to, co mówi ...Odpowiedzi:
To jest rzeczywiście powiązane. Rozwiązaniem jest poinstruowanie instancji słownika, aby nie korzystała ze standardowej metody porównywania ciągów (która jest wrażliwa na wielkość liter), ale raczej używa metody niewrażliwej na wielkość liter. Odbywa się to za pomocą odpowiedniego konstruktora :
Konstruktor oczekuje instrukcji,
IEqualityComparer
która mówi słownikowi, jak porównywać klucze.StringComparer.InvariantCultureIgnoreCase
dajeIEqualityComparer
instancję, która porównuje ciągi znaków bez uwzględniania wielkości liter.źródło
źródło
Istnieje kilka przypadków, w których masz do czynienia ze słownikiem, który jest pobierany z zewnętrznego lub zewnętrznego dll. Korzystanie z linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
źródło
Any
naSingleOrDefault
siebie, nienull
wrócisz, jeśli nie istnieje, zamiast tego otrzymasz parę kluczy z kluczem i wartością ustawioną nanull
!Contains
Wygląda na bardzo specyficzny przypadek użycia czegoś, nad czym pracowałeś w tym czasie. Myślę, że jako bardziej ogólna pomocna odpowiedźEquals
jest lepsza. I w tej samej notatce, zamiast powielać ciąg zToLower()
, byłoby jeszcze lepiej użyćStringComparison.xxxCase
.dict.Keys.Contains("bla", appropriate comparer)
przeciążenia LINQ w celu ułatwienia użycia.Właśnie napotkałem ten sam problem, w którym potrzebowałem słownika uwzględniającego wielkość liter w kontrolerze ASP.NET Core.
Napisałem metodę rozszerzającą, która załatwia sprawę. Może to może być pomocne również dla innych ...
Aby skorzystać z metody rozszerzenia:
Następnie pobierz wartość ze słownika zawierającą:
źródło
Jeśli nie masz żadnej kontroli nad tworzeniem instancji, powiedzmy, że Twój obiekt jest zdesteryylowany z json itp., Możesz utworzyć klasę opakowania, która dziedziczy po klasie słownika.
źródło