C# Нечувствительный к регистру ключ словаря


#1

Нужно сделать так, что бы при добавлении в словарь нового элемента (тип ключа - string), и если в словаре уже существует такой же ключ (неважно будут ли у него некоторые символы в других регистрах), словарь должен воспринимать его как один и тот же ключ. Как это можно реализовать?


#2

Из урока Александра Шевчука я вынес следующее: для Hashtable в конструктор можно передать экземпляр реализующий интерфейс IEqualityComparer, который и будет определять существует ли такой ключ в словаре или нет.

Пример с того же урока:

public class InsensitiveComparer : IEqualityComparer
{
    readonly CaseInsensitiveComparer comparer = new CaseInsensitiveComparer();

    public int GetHashCode(object obj)
    {
        return obj.ToString().ToLowerInvariant().GetHashCode();
    }

    public new bool Equals(object x, object y)
    {
        return comparer.Compare(x, y) == 0;
    }
}

static void Main()
{

    // Создаем коллекцию не чувствительную к регистру символов.
    var dehash = new Hashtable(new InsensitiveComparer());

    dehash["First"] = "1st";
    dehash["Second"] = "2nd";
    dehash["Third"] = "3rd";
    dehash["Fourth"] = "4th";
    dehash["fourth"] = "4TH!!!";

    Console.WriteLine(dehash.Count);

    // Delay.
    Console.ReadKey();
}

если же Вы будете в качестве ключа использовать не строки, а экземпляры других классов, то переопределите в них Equals и GetHashCode


#3

спасибо!