2010-08-19 3 views
5

У меня есть словарь 10000 Характеристики комбинаций/размер/цвет, который я создал что-то вроде:Скорость поиска значения словаря .NET по ключу?

AllRecords = DB.ProductColourSizes _ 
      .ToDictionary(function(b) String.Format("{0}_{1}_{2}", _ 
      b.ProductCode, b.ColourCode, b.SizeCode)) 

Так пример ключ, как «13AI_GRS_M»

я должен синхронизировать свою базу данных с ERP компании каждые 30 минут, и для каждой комбинации цветов/размеров мне нужно использовать этот словарь для добавления, редактирования или удаления записей. Хотелось бы, чтобы они предоставили идентификационные номера.

Я не знаю, как Словарь работает внутри страны. Насколько быстро .NET находит правильное значение на основе такого ключа? Должен ли я сортировать запрос базы данных, или у .NET есть другой способ идентификации ключа?

Или мне нужно преобразовать его в список и использовать словарь для определения правильного индекса? Или по-другому?

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

Большое спасибо, Стив

+0

Большое спасибо за ваши ответы. Я новичок на сайте, поэтому пока не знаю этикета, но я понял, что задал вопрос, на котором 5 человек все хорошо указали, что код «в порядке» по разным причинам. Должен ли я отметить их все полезными? Еще раз спасибо. Steve –

+0

Вы можете только отметить 1 как «принято». Просто используйте свое мнение. –

ответ

3

Для того, что вы делаете, словарь идеален.

извлечения время на клавишах для элементов в словаре чертовски быстро, но в конечном счете, зависит от функции хэша-кода ключа (в вашем случае string.GetHashCode()).

Вам повезло, потому что функция GetHashCode() строки .Net очень хороша. Если вы получите столкновение хеш-кода, .Net вызовет метод Equals на объекте и, следовательно, гарантирует уникальность.

У нас есть словари с сотнями тысяч предметов, а время поиска пренебрежимо мало.

В этом случае сортировка результирующего набора из базы данных не принесет никакой пользы.

Надеюсь, это поможет.

1

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

Вы можете написать свой собственный KeyClass с членами ProductCode, ColourCode и SizeCode, но тогда вам придется перегружать элементы GetHashCode и Equals (и связанные). И будет довольно сложно улучшить GethashCode System.String, и довольно легко сделать ошибки.

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

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

+0

Спасибо, что указали мне на область .NET. Я не знал ... что-то еще для исследования! –

+1

Точно, не беспокойтесь о производительности, пока это не проблема, а затем укажите ее профилировщиком, часто это не так, как вы думаете. –

1

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

2

Насколько быстро .NET находит правильное значение на основе такого ключа?

Сложность получения значения для ключа близко к O (1) according to MSDN, так что это довольно быстро ...

Кроме того, из MSDN:

Скорость поиска зависит о качестве алгоритма хэширования типа, указанного для TKey.

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

+0

Томас, извинившись за то, что он педантичен, но что операция имеет низкую сложность, конечно, не означает, что она неотступно быстро. Это будет быстрее, чем операция с высокой степенью сложности, но если базовый алгоритм является сложным, большая нотация O может быть низкой, но операция может быть медленной. Или я говорю из своей задницы? (Я не эксперт по Big O). –

+0

Вы правы, сложность - это не единственное, что нужно учитывать, но непостоянная сложность окажет существенное влияние на фактическую скорость поиска по мере роста словаря. Это может быть только так быстро, потому что сложность O (1) –

+0

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

0

Я использую этот «шаблон» довольно часто, если вы не можете получить SQL-запросы (особенно в SQL CE), чтобы работать достаточно быстро.

Возможно, вы захотите также просмотреть функцию ToLookup, так как я считаю ее более удобной в большинстве случаев. Скорость поиска не изменяется, он использует словарь, сопоставленный с коллекциями.

+0

ToLookup() также будет очень помогать в будущем, спасибо. –

Смежные вопросы