Я не на 100% уверен в точных данных, которые вы хотите использовать в качестве ключа. Я думаю 2? 2 целочисленные значения? Это то, что я предполагаю ниже, но если вы хотите три или другой тип, просто настройте соответственно. Я предлагаю следующее (шаг 1 необходим, шаг 2 необязателен, но я бы это сделал)
Шаг 1 Создание собственной структуры ключа, которая будет использоваться в качестве ключа в стандартном словаре. Присвойте ему 2 свойства (или три, что угодно) для ваших значений, которые будут действовать в качестве ключа, и / или конструктор, принимающий / устанавливающий эти значения.
Укажите метод GetHashCode. Что-то вроде:
public override int GetHashCode()
{
unchecked
{
return (_empId * 397) ^ _payYr;
}
}
Примечание: Да, вы можете использовать кортеж. Кортежи , , не так круто, как кажется на первый взгляд. Ваши имена собственности будут Item1 и т. Д. Не очень ясно. И вы часто в конечном итоге хотели переопределить и добавить вещи достаточно скоро. Просто начните с нуля.
Вот так:
публичная структура PayKey {
private int _empId
private int _payYr;
public PayKey (int empId, int payYr) {
_empId = empId;
_payYr = payYr;
}
public override int GetHashCode()
{
{
return (_empId * 83) ^ _payYr;
}
}
} * * тысяча двадцать-один
Примечание: Если любое из нескольких значений, которые вы хотите использовать в комбинированном ключе, является ссылочным типом, вам, вероятно, следует создать класс вместо структуры. Если это так, вам также потребуется переопределить Equals
, чтобы он работал как ключ словаря.
public override bool Equals( object pkMaybe ){
if( pkMaybe is PayKey ) {
PayKey pk = (PayKey) pkMaybe ;
return _empId = pk.EmpId && _payYr = pk.PayYr;
}
else {
return false;
}
}
(И добавьте открытые свойства для значений ключей, если вы этого еще не сделали.)
Или, если вы создаете пользовательский словарь, как я упоминаю ниже, было бы удобно использовать IEqualityComparer . (По сути, если вы используете класс в качестве ключа, вы должны убедиться, что словарь увидит два идентичных объекта PayKey как «равные». По умолчанию, даже с одинаковыми значениями, они являются ссылками на разные объекты, поэтому структура будет учитывать им не равны)
Шаг 2 Создайте класс, который наследуется от словаря. Дайте ему два дополнительных метода:
- Метод add, который принимает два ключевых параметра, а также значение, которое вы хотите добавить. Внутри вы создадите одну из ваших ключевых структур и вызовете ее базовый метод add, в котором ключ будет являться ключом, а ваше значение конечно будет значением.
- перегрузка для предмета или названа по вашему желанию. Этот метод примет в качестве параметров 2 целых числа вашего ключа и вернет элемент. Внутри этого метода вы создадите одну из ваших ключевых структур и вызовете метод базового элемента со структурой ключа для получения объекта.
- Кроме того, для вашего конечного удобства вы, вероятно, захотите добавить другие перегрузки в свой словарь, где вы можете указать свои значения ключа, вместо того, чтобы каждый раз создавать собственную структуру ключа. Например, первое, что я, вероятно, сделаю, это добавлю свойство KeyExists, которое принимает мои два значения ключа.