Если у меня Dictionary<String,...>
, можно ли сделать такие методы, как ContainsKey
, нечувствительными к регистру?
Это казалось связанным, но я не понял этого должным образом: Словарь c #: создание ключа без учета регистра через объявления
Если у меня Dictionary<String,...>
, можно ли сделать такие методы, как ContainsKey
, нечувствительными к регистру?
Это казалось связанным, но я не понял этого должным образом: Словарь c #: создание ключа без учета регистра через объявления
Это казалось связанным, но я не понял этого должным образом: c # Dictionary: создание ключа без учета регистра через объявления
Это действительно связано. Решение состоит в том, чтобы указать экземпляру словаря не использовать стандартный метод сравнения строк (который чувствителен к регистру), а использовать метод без учета регистра. Это делается с помощью соответствующего конструктора:
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Конструктор ожидает IEqualityComparer
, который сообщает словарь, как сравнивать ключи.
StringComparer.InvariantCultureIgnoreCase
предоставляет вам экземпляр IEqualityComparer
, который сравнивает строки в без учета регистра.
Есть несколько шансов, что вы имеете дело со словарем, взятым из сторонней или внешней dll. Использование linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
на SingleOrDefault
, вы не получите null
обратно, если он не существует, вместо этого вы получите пару ключей и значений, для которых установлено значение null
!
- person NibblyPig; 02.03.2017
Contains
Похоже, это очень специфический вариант использования того, над чем вы работали в то время. В качестве более общего полезного ответа я думаю, что Equals
лучше. И в том же примечании, вместо того, чтобы дублировать строку с ToLower()
, было бы даже лучше использовать StringComparison.xxxCase
.
- person Suamere; 06.02.2018
dict.Keys.Contains("bla", appropriate comparer)
LINQ для простоты использования.
- person nawfal; 23.07.2019
Если у вас нет контроля над созданием экземпляра, допустим, ваш объект удален из json и т. Д., Вы можете создать класс-оболочку, который наследуется от класса словаря.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
Я столкнулся с той же проблемой, когда мне нужен был чувствительный к регистру словарь в контроллере ASP.NET Core.
Я написал метод расширения, который помогает. Может быть, это будет полезно и для других ...
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;
}
Чтобы использовать метод расширения:
myDictionary.ConvertToCaseInSensitive();
Затем получите значение из словаря с помощью:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");