Есть ли способ поиска в словаре несколькими способами, используя поиск по ключу? - PullRequest
2 голосов
/ 15 октября 2011

По сути, у меня есть коллекция Dictionary<Guid, Movie> Movies и поиск фильмов с использованием Guid, который в основном является movie.Guid. Это прекрасно работает, но я также хочу иметь возможность искать в том же словаре, используя movie.Name, не просматривая каждый элемент.

Возможно ли это, или мне нужно создать еще Dictionary<K, V> для этого?

Ответы [ 8 ]

3 голосов
/ 15 октября 2011

Просто есть два словаря, один из которых имеет guid в качестве ключа, а другой - с именем в качестве ключа.

1 голос
/ 15 октября 2011

Вместо того, чтобы использовать два словаря, вам было бы гораздо лучше использовать один контейнерный класс с двумя словарями внутри него.

Какой-то парень по имени Джон придумал частичное решение этой проблемы (которое вы могли бы легкопостроить на), оставив свой код здесь: Получение ключа значения универсального словаря?

1 голос
/ 15 октября 2011

Так как словари предназначены для отображения one-way, вы не можете получить ключи от значений.

Вам понадобятся два словаря.

Также есть предложение: Вы можете использовать пользовательскийхеш-функция для ключей вместо идентификаторов GUID и сохранение хеш-кода Movie Names в качестве ключей.Тогда вы действительно можете выполнить двусторонний поиск в своем словаре.

1 голос
/ 15 октября 2011

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

1 голос
/ 15 октября 2011

Вы не можете использовать этот словарь для поиска с такой же эффективностью. Но вы можете легко запустить запрос LINQ для свойства вашего словаря Values, которое является просто набором значений Movie.

var moviesIWant = From m in movieLookup.Values
                  Where m.Name == "Star Wars"
                  Select m

Некоторые мысли:

  • Когда вы найдете свой ответ, вы не будете иметь направляющие, если только они не были также свойством фильма.
  • Для небольшого словаря это просто отлично. Для больших и повторяющихся поисков вам следует подумать о создании других словарей на основе других значений, по которым вы хотите искать. Только таким образом вы достигнете скорости поиска guid, сопоставимой с вашим оригинальным словарем.

Вы можете создать еще один словарь по имени. Как только вы это сделаете, вы можете искать в этом словаре по его ключу, и он будет иметь ту же суперэффективность, что и ваш оригинальный словарь, даже для очень большого словаря.

var moviesByName = movieLookup.Values.ToDictionary(m => m.Name, m => m)
1 голос
/ 15 октября 2011

Вы можете выполнить поиск с помощью свойства Значения:

dictionary.Values.Where(movie => movie.Name == "Some Name")

Вы потеряете эффективность поиска на основе ключей, но он все равно будет работать.

1 голос
/ 15 октября 2011

Если вы не хотите смотреть на каждый элемент, вам нужно проиндексировать его в другом направлении.Это означает еще один словарь, чтобы получить O (1) .

0 голосов
/ 15 октября 2011

Нет, я не верю, что это возможно. Вам придется использовать другой словарь.

Если вы хотите искать больше атрибутов фильма, вам лучше переместить данные в базу данных и использовать их для запросов. Это то, для чего базы данных хороши.

...