Фильтр и поиск из наборов данных в памяти - PullRequest
3 голосов
/ 09 марта 2010

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

В настоящее время я использую объекты POCO с одним или несколькими словарями для индексации. Это отлично работает, когда мне нужно найти что-то по определенному ключу, но иногда это не так. В качестве примера, мне часто нужно найти запись в определенном диапазоне времени-даты. И иногда мне нужна запись с самой низкой ценой. Чаще всего запросы просматривают несколько простых ключей и одно или два других поля одновременно.

Существуют ли какие-либо инструменты, продукты, библиотеки (нацеленные на .NET-framework), которые могут помочь мне в этом? Или мне нужно взять эту большую пыльную старую книгу по Алгоритмам и начать смотреть на деревья поиска?

Пример:

Trip

  • DepartureCode
  • DestinationCode
  • HotelCode
  • RoomCode
  • Дата
  • Цена

Мне нужно, чтобы запрос был чем-то вроде: «принеси мне самое дешевое путешествие между 2010-03-09 и 2010-03-12, где DepartureCode = LAX DestinationCode = NYC»

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

«Самая низкая цена» и «определенный диапазон дат / времени» могут обрабатываться с использованием только отсортированной коллекции и двоичного поиска. SortedList / SortedDictionary (или SortedSet, если вы используете .NET 4.0), вероятно, сделают все, что вам нужно здесь, с довольно небольшим объемом работы.

0 голосов
/ 09 марта 2010

Как насчет метода DataSet.Table ("YourTable") .Select () ?

Dim myRows() as DataRow = myDataSet.Tables("myTable").Select("Date>" & _
    myBeginDate & "AND Date<" & myEndDate)

РЕДАКТИРОВАТЬ: С MSDN

Конструкция DataView

DataView строит индекс для данные в базовом DataTable, когда и DataView создается, и когда Sort, RowFilter или RowStateFilter свойства изменены. При создании объект DataView, используйте DataView конструктор, который принимает сортировку, Значения RowFilter и RowStateFilter в качестве аргументов конструктора (наряду с базовый DataTable). Результат Индекс строится один раз. Создание «пустой» DataView и установка Сортировать, RowFilter или RowStateFilter свойства впоследствии приводит к Индекс строится как минимум дважды.

Так что, если вы хотите проиндексировать свой DataSet, похоже, что DataView может предоставить вам это.

...