Тогда вам нужно переопределить GetHashCode и Equals для класса Key.
Без этого вы получаете реализацию обоих по умолчанию. Что приводит к тому, что хэш-код для a и b, скорее всего, не совпадает (я не знаю, как выглядит реализация по умолчанию), а a точно не равен b (реализация Equals () по умолчанию проверяет равенство ссылок ).
В вашем случае, предполагая, что «имя» не является нулем, оно может быть реализовано как
public class Key
{
string name;
public override int GetHashCode()
{
return name.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Key objAsKey = obj as Key;
if (objAsKey == null)
{
return false;
}
return this.name.Equals(objAsKey.Name);
}
}
Является ли это удовлетворительным хешем, это отдельная история, но, тем не менее, он показывает принцип.