Мультиключевые словари (другого вида) в C#?

Функция или метод - это именуемый вызываемый фрагмент кода, который выполняет некоторые операции и при необходимости возвращает значение.

В C языке используется термин функция. Java & amp; C # люди сказали бы, что это метод (и функция в этом случае определяется внутри класса / объекта).

C ++ программист мог бы назвать это функцией или иногда методом (в зависимости от того, пишут ли они код на C ++ процедурного стиля или делают объектно-ориентированный способ на C ++, программист, работающий только на C / C ++, вероятно, вызовет это функция, потому что термин «метод» реже используется в литературе C / C ++).

Вы используете функцию, просто вызывая ее имя, например,

result = mySum(num1, num2);


Вы бы вызвали метод, ссылаясь на его объект сначала, как,

result = MyCalc.mySum(num1,num2);
9
задан Community 23 May 2017 в 12:07
поделиться

7 ответов

Это сообщение в блоге , кажется, подробно описывает довольно приличную реализацию.

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

MultiKeyDictionary - это класс C # который завершает и расширяет Generic Объект словаря, предоставленный Microsoft в .NET 2.0 и выше. Эта позволяет разработчику создать общий словарь значений и ссылка на список значений с помощью двух ключей вместо только тот, который предоставлен Microsoft реализация Generic Словарь <...>. Вы можете увидеть мой статья на CodeProject (здесь), однако этот код более актуален и содержит ошибку бесплатно.

10
ответ дан 4 December 2019 в 09:37
поделиться

В настоящее время в .NET BCL нет ничего встроенного для этого типа коллекции.

Я вижу два варианта:

  1. Использовать двухуровневый словарь . Первый уровень сопоставляет разные ключи с некоторым общим уникальным ключом (скажем, GUID), а второй уровень сопоставляет GUID с фактическим значением.

  2. Создайте собственный класс ключа и реализуйте Equals () и GetHashCode (), чтобы любой одного компонента ключа достаточно, чтобы найти весь ключ. Затем вы можете предоставить вспомогательные методы для создания экземпляров ключа, используя только одно из значений, чтобы вы могли выполнять поиск.

3
ответ дан 4 December 2019 в 09:37
поделиться

Да, определите класс, который добавляет объект во внутреннюю хеш-таблицу с обоими ключами,

 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);
      }
  }
4
ответ дан 4 December 2019 в 09:37
поделиться

Конечно, это объектно-ориентированный язык, и вы можете реализовать все, что захотите. Вам придется разрешить некоторую двусмысленность (что, если TKey1 и TKey2 одного типа, какие методы тогда будут вызваны?)

0
ответ дан 4 December 2019 в 09:37
поделиться

Вы не сможете определять перегрузки для обоих типов, а система универсальных типов не допускает произвольное количество типов (например, методы позволяют параметры). Итак, вы застряли бы с набором классов, которые определяли 2, 3, 4 и т. Д. Одновременных ключа. Кроме того, вам придется использовать объект в качестве параметра для получения и установки, используя проверки типа во время выполнения для имитации перегрузки.

Кроме того, вы должны сохранить только один словарь другие словари будут иметь вид , и будут действовать как индексы в основном словаре.

Это в основном стандартный код.

0
ответ дан 4 December 2019 в 09:37
поделиться

Моя реализация IndexMap может быть хорошей основой для ее переписывания с Java на C #. Модель программирования не такая элегантная, как хотелось бы, но она не предназначена для непосредственной разработки. Скорее, он находится за библиотекой кеширования, которая предоставляет стандартные аннотации, чтобы обеспечить лаконичный стиль кодирования. Используя интерфейс карты, он обеспечивает чистую композиционную модель в сочетании с самозаполняющимися, истекающими и удаляемыми декораторами карты. Я уверен, что кто-то может придумать хороший программный интерфейс для прямого использования, где допустимо потерять преимущества интерфейса Map.

0
ответ дан 4 December 2019 в 09:37
поделиться

Другой простой (и эффективной) реализацией будет использование типа PowerCollections ' Pair в качестве ключа словаря что-то вроде

Dictionary<Pair<TKey1, TKey2>, TValue> foo;
foo.Add(new Pair<TKey1, TKey2>(key1, key2), value);

Pair <> последовательно реализует Equals и GetHashCode , поэтому вам не нужно прибегать к многоуровневым словарям (которые более громоздки и наверное менее эффективен).

Также есть Triple , если вам нужен словарь с 3 ключами.

2
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: