2010-01-15 12 views
2

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

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

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

Любые идеи?

Спасибо, Corey

+0

Почему бы не выполнить подсчет и не отсортировать в _your_ системе _in_ запрос? – kennytm

+0

Это внешняя система. У меня нет возможности делать счет и сортировать там. Я могу получить доступ только к данным через API внешней системы. Поэтому я могу сделать только следующее: List _results = SystemAPI.GetResults(); Затем, когда у меня есть список MyObjects, мне нужно выяснить, сколько из каждого из моих свойств есть. –

+0

* «Я думаю, что каждый элемент по одному не очень эффективен». * Если кто-то придумал лучший способ, он действительно стал бы очень богатым. –

ответ

1

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

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

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

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

+0

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

+0

Я мог бы использовать какое-то кеширование, чтобы, если я вижу, что Пользователь А попросил те же самые грани, которые выбрал Пользователь Б 5 минут назад, просто дайте им результаты из кеша. Но тогда мне нужно иметь возможность инициировать обновление кеша, если данные в исходной системе меняются. –

0

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

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

+0

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

+0

Эй, Джон, http://stackoverflow.com/questions/2072752/why-doesnt-my-threaded-net-app-scale- linearly-when-allocating-large-amounts-of – Will

+0

@Corey: Как бы вы ожидали * любая * структура данных для магической обработки элементов без повторения через список как минимум * один раз *? Когда-то нужно все, что вам нужно, но вам нужно сделать это один раз ... –

1

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

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

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

+0

Нет исходного запроса не из СУБД. Это через сторонний API, поэтому мой запрос ограничен. –

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