Функция или метод - это именуемый вызываемый фрагмент кода, который выполняет некоторые операции и при необходимости возвращает значение.
В C языке используется термин функция. Java & amp; C # люди сказали бы, что это метод (и функция в этом случае определяется внутри класса / объекта).
C ++ программист мог бы назвать это функцией или иногда методом (в зависимости от того, пишут ли они код на C ++ процедурного стиля или делают объектно-ориентированный способ на C ++, программист, работающий только на C / C ++, вероятно, вызовет это функция, потому что термин «метод» реже используется в литературе C / C ++).
Вы используете функцию, просто вызывая ее имя, например,
result = mySum(num1, num2);
Вы бы вызвали метод, ссылаясь на его объект сначала, как,
result = MyCalc.mySum(num1,num2);
Это сообщение в блоге , кажется, подробно описывает довольно приличную реализацию.
Многоключевой универсальный класс словаря для C #
MultiKeyDictionary - это класс C # который завершает и расширяет Generic Объект словаря, предоставленный Microsoft в .NET 2.0 и выше. Эта позволяет разработчику создать общий словарь значений и ссылка на список значений с помощью двух ключей вместо только тот, который предоставлен Microsoft реализация Generic Словарь <...>. Вы можете увидеть мой статья на CodeProject (здесь), однако этот код более актуален и содержит ошибку бесплатно.
В настоящее время в .NET BCL нет ничего встроенного для этого типа коллекции.
Я вижу два варианта:
Использовать двухуровневый словарь . Первый уровень сопоставляет разные ключи с некоторым общим уникальным ключом (скажем, GUID), а второй уровень сопоставляет GUID с фактическим значением.
Создайте собственный класс ключа и реализуйте Equals () и GetHashCode (), чтобы любой одного компонента ключа достаточно, чтобы найти весь ключ. Затем вы можете предоставить вспомогательные методы для создания экземпляров ключа, используя только одно из значений, чтобы вы могли выполнять поиск.
Да, определите класс, который добавляет объект во внутреннюю хеш-таблицу с обоими ключами,
public MyClass<k1, k2, T>: Dictionary<object, T>
{
private Dictionary<k1, k2> keyMap;
public new Add(k1 key1Val, k2 key2Val, T object)
{
keyMap.Add(key1Val, key2Val);
base.Add(k2, object)
}
public Remove(k1 key1Val)
{
base.Remove(keyMap[key1Val]);
keyMap.Remove(key1Val);
}
public Remove(k2 key2Val)
{
base.Remove(key2Val);
keyMap.Remove(key2Val);
}
}
Конечно, это объектно-ориентированный язык, и вы можете реализовать все, что захотите. Вам придется разрешить некоторую двусмысленность (что, если TKey1 и TKey2 одного типа, какие методы тогда будут вызваны?)
Вы не сможете определять перегрузки для обоих типов, а система универсальных типов не допускает произвольное количество типов (например, методы позволяют параметры). Итак, вы застряли бы с набором классов, которые определяли 2, 3, 4 и т. Д. Одновременных ключа. Кроме того, вам придется использовать объект в качестве параметра для получения и установки, используя проверки типа во время выполнения для имитации перегрузки.
Кроме того, вы должны сохранить только один словарь
другие словари будут иметь вид
,
и будут действовать как индексы в основном словаре.
Это в основном стандартный код.
Моя реализация IndexMap может быть хорошей основой для ее переписывания с Java на C #. Модель программирования не такая элегантная, как хотелось бы, но она не предназначена для непосредственной разработки. Скорее, он находится за библиотекой кеширования, которая предоставляет стандартные аннотации, чтобы обеспечить лаконичный стиль кодирования. Используя интерфейс карты, он обеспечивает чистую композиционную модель в сочетании с самозаполняющимися, истекающими и удаляемыми декораторами карты. Я уверен, что кто-то может придумать хороший программный интерфейс для прямого использования, где допустимо потерять преимущества интерфейса Map.
Другой простой (и эффективной) реализацией будет использование типа PowerCollections ' Pair
в качестве ключа словаря что-то вроде
Dictionary<Pair<TKey1, TKey2>, TValue> foo;
foo.Add(new Pair<TKey1, TKey2>(key1, key2), value);
Pair <> последовательно реализует Equals
и GetHashCode
, поэтому вам не нужно прибегать к многоуровневым словарям (которые более громоздки и наверное менее эффективен).
Также есть Triple
, если вам нужен словарь с 3 ключами.