Что такое хорошая структура данных .NET для поиска уникальных предметов?

2

У меня есть большая коллекция пользовательских объектов, которые я получил из запроса в моей системе. Скажем, эти объекты имеют 5 разных свойств - FirstName, LastName, Gender, ZipCode и Birthday. Для каждого из разных свойств я хотел бы получить список всех уникальных значений и их счетчиков и отсортировать их в порядке убывания. Это своего рода ограненная навигационная система. Поэтому, если у меня есть 5000 результатов в моем первоначальном запросе, я бы хотел, чтобы отображать первые 10 первых имен от самых популярных до наименее популярных со счетчиком рядом с ним. И тогда то же самое с другими свойствами.

В настоящее время у меня есть процедура, которая проходит каждый элемент по одному и анализирует различные свойства и хранит кучу разных хеш-таблиц с информацией. Он работает, но он очень медленный. Я думаю, что каждый элемент по одному не очень эффективен. Есть ли какой-либо другой тип структуры С#, который я мог бы использовать, чтобы облегчить получение этого типа информации? Я знаю, что SQL Server отлично справляется с этим типом вещей, но я не думаю, что это действительно возможно. Я получаю список пользовательских объектов из API другой системы. Поэтому я должен был бы взять этот список объектов и как-то поместить их в временную таблицу, и это будет поражать цель, о которой я думаю. Плюс временные таблицы SQL Server связаны с подключением, я думаю, и мое приложение будет повторно использовать соединения.

ИЗМЕНИТЬ: Я стараюсь избегать перебора списка и обработки каждого отдельного элемента. Мне было интересно, есть ли какая-то структура данных, которая позволила бы мне сортировать запрос всего списка сразу (например, базу данных) и получать информацию. Проблема в том, что наш веб-сервер с интерфейсом просто забит, потому что у нас много трафика на сервере, и люди бьют эти граненые навигационные страницы, и я ищу более эффективный способ сделать это.

Любые идеи?

Спасибо, Corey

  • 0
    Почему бы не выполнить подсчет и сортировку в вашей системе в запросе?
  • 0
    Это внешняя система. У меня нет способа сделать подсчет и сортировать там. Я могу получить доступ к данным только через API внешней системы. Поэтому я могу сделать только следующее - List <MyObjects> _results = SystemAPI.GetResults (); Затем, когда у меня есть этот список объектов MyObjects, мне нужно выяснить, сколько у меня каждого из свойств.
Показать ещё 1 комментарий
Теги:
data-structures
unique

3 ответа

1
Лучший ответ

К сожалению, я уверен, что ответ на ваш вопрос: "Нет". Если только способ получения ваших данных - это неиндексированный List <MyObject> , а затем что-то будет проходить через эти элементы по отдельности и анализировать их для Top-N или создания индексов. Даже если вы передадите это на другой инструмент (временная база данных или структура данных сторонних разработчиков), вы просто помещаете обработку в другое место, и ваш процессор будет кричать так же. Решение, которое вы изложите в своем первоначальном вопросе, кажется наиболее разумным.

Несколько предложений:

  • Являются ли эти списки Top-N одинаковыми для всех пользователей или могут быть разбиты на несколько вариантов использования? Вы можете получить их один раз и сохранить их в веб-кеше. Возможно, установите фоновый процесс, чтобы обновлять их каждые M минут, чтобы они были несколько обновлены.
  • Это просто проблема восприятия пользовательского интерфейса? Не могли бы вы сначала рассчитать и отобразить наиболее важные результаты, а затем рассчитать остальные в фоновом режиме и доставить на страницу асинхронно?
  • Попросите поставщика API для более надежного способа получить результаты?:)
  • Бросить больше аппаратного обеспечения на это??:)

Извините за не-ответ, но я не думаю, что здесь есть волшебная пуля.

  • 0
    Спасибо, Дейв. Это было своего рода то, что я предположил. Возможно, мне придется просто немного реорганизовать свой код и искать способы его ускорения или оптимизации. Система, которую я создаю, является многогранной навигацией и позволяет людям выбирать фасеты (например, пол или почтовый индекс и т. Д.), А затем видеть новый список объектов, которые соответствуют выбранным фасетам. И, конечно же, списки Top-N отличаются, потому что теперь они применяются только к результатам для выбранных в данный момент аспектов. Надеюсь, что это имеет смысл.
  • 0
    Я мог бы использовать какое-то кэширование, чтобы, если я вижу, что пользователь А запросил те же самые грани, которые пользователь Б выбрал 5 минут назад, просто выдайте им результаты из кэша. Но тогда мне нужно иметь возможность активировать кэш для обновления, если данные в исходной системе изменяются.
1

i4o - индексированный LINQ http://www.codeplex.com/i4o позволяет помещать индексы в объекты.

Он в основном обеспечивает индексирование стиля RDBMS для clr.

Используете ли вы СУБД для своего первоначального запроса? В этом случае ответ будет следующим: Почему бы не просто спроектировать определенные SQL-запросы?

  • 0
    Нет первоначального запроса не из СУБД. Это через сторонний API, поэтому мои запросы ограничены.
0

Сохранение одного словаря на каждое свойство должно работать нормально. Как медленно? Можете ли вы показать нам код, который вы используете? 5000 предметов следует обрабатывать в мгновение ока.

Используете ли вы .NET 3.5? Если это так, LINQ может помочь вам в этом многом - в частности, использование ToLookup с каждым свойством, в свою очередь, будет работать очень хорошо.

  • 0
    Нет, я не использую .NET 3.5. Чего я пытаюсь избежать, так это перебора списка и обработки каждого отдельного элемента. Мне было интересно, существует ли какая-то структура данных, которая позволила бы мне сортировать запросы по всему списку сразу (например, в базе данных) и получать информацию. Проблема в том, что наш интерфейсный веб-сервер просто забивается, потому что у нас много трафика на сервере, и люди заходят на эти многогранные навигационные страницы, и я ищу более эффективный способ сделать это.
  • 0
    Привет, Джон, stackoverflow.com/questions/2072752/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню