Если у меня Dictionary<String,...>
есть, можно ли сделать такие методы, как ContainsKey
без учета регистра?
Это казалось связанным, но я не понял его правильно: c # Dictionary: создание ключа без учета регистра с помощью объявлений
Если у меня Dictionary<String,...>
есть, можно ли сделать такие методы, как ContainsKey
без учета регистра?
Это казалось связанным, но я не понял его правильно: c # Dictionary: создание ключа без учета регистра с помощью объявлений
Ответы:
Это казалось связанным, но я не понял его правильно: c # Dictionary: создание ключа без учета регистра с помощью объявлений
Это действительно связано. Решение состоит в том, чтобы сказать экземпляру словаря не использовать стандартный метод сравнения строк (который чувствителен к регистру), а использовать регистронезависимый. Это делается с помощью соответствующего конструктора :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Конструктор ожидает, IEqualityComparer
что словарь говорит, как сравнивать ключи.
StringComparer.InvariantCultureIgnoreCase
дает вам IEqualityComparer
экземпляр, который сравнивает строки без учета регистра.
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
Есть немного шансов, когда ваше дело со словарем, который извлекается из сторонних или внешних DLL. Используя linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
к SingleOrDefault
вам не получите null
обратно , если он не существует, вместо этого вы получите KeyValuePair как с ключом и устанавливающим null
!
Contains
Похоже, это очень специфический вариант использования того, над чем вы работали в то время. Как более общий полезный ответ, я думаю, что Equals
лучше. И на этой же ноте вместо дублирования строки ToLower()
было бы лучше использовать StringComparison.xxxCase
.
dict.Keys.Contains("bla", appropriate comparer)
деталей ) используйте перегрузку LINQ для простоты использования.
Я просто столкнулся с такой же проблемой, когда мне понадобился регистр символов в контроллере 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!");
Если у вас нет контроля при создании экземпляра, скажем, ваш объект удален от json и т. Д., Вы можете создать класс-оболочку, который наследуется от словарного класса.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? Он делает то, что говорит ...