У меня есть большая коллекция пользовательских объектов, которые я получил из запроса в моей системе. Скажем, эти объекты имеют 5 разных свойств - FirstName, LastName, Gender, ZipCode и Birthday. Для каждого из разных свойств я хотел бы получить список всех уникальных значений и их счетчиков и отсортировать их в порядке убывания. Это своего рода ограненная навигационная система. Поэтому, если у меня есть 5000 результатов в моем первоначальном запросе, я бы хотел, чтобы отображать первые 10 первых имен от самых популярных до наименее популярных со счетчиком рядом с ним. И тогда то же самое с другими свойствами.
В настоящее время у меня есть процедура, которая проходит каждый элемент по одному и анализирует различные свойства и хранит кучу разных хеш-таблиц с информацией. Он работает, но он очень медленный. Я думаю, что каждый элемент по одному не очень эффективен. Есть ли какой-либо другой тип структуры С#, который я мог бы использовать, чтобы облегчить получение этого типа информации? Я знаю, что SQL Server отлично справляется с этим типом вещей, но я не думаю, что это действительно возможно. Я получаю список пользовательских объектов из API другой системы. Поэтому я должен был бы взять этот список объектов и как-то поместить их в временную таблицу, и это будет поражать цель, о которой я думаю. Плюс временные таблицы SQL Server связаны с подключением, я думаю, и мое приложение будет повторно использовать соединения.
ИЗМЕНИТЬ: Я стараюсь избегать перебора списка и обработки каждого отдельного элемента. Мне было интересно, есть ли какая-то структура данных, которая позволила бы мне сортировать запрос всего списка сразу (например, базу данных) и получать информацию. Проблема в том, что наш веб-сервер с интерфейсом просто забит, потому что у нас много трафика на сервере, и люди бьют эти граненые навигационные страницы, и я ищу более эффективный способ сделать это.
Любые идеи?
Спасибо, Corey
К сожалению, я уверен, что ответ на ваш вопрос: "Нет". Если только способ получения ваших данных - это неиндексированный List <MyObject> , а затем что-то будет проходить через эти элементы по отдельности и анализировать их для Top-N или создания индексов. Даже если вы передадите это на другой инструмент (временная база данных или структура данных сторонних разработчиков), вы просто помещаете обработку в другое место, и ваш процессор будет кричать так же. Решение, которое вы изложите в своем первоначальном вопросе, кажется наиболее разумным.
Несколько предложений:
Извините за не-ответ, но я не думаю, что здесь есть волшебная пуля.
i4o - индексированный LINQ http://www.codeplex.com/i4o позволяет помещать индексы в объекты.
Он в основном обеспечивает индексирование стиля RDBMS для clr.
Используете ли вы СУБД для своего первоначального запроса? В этом случае ответ будет следующим: Почему бы не просто спроектировать определенные SQL-запросы?
Сохранение одного словаря на каждое свойство должно работать нормально. Как медленно? Можете ли вы показать нам код, который вы используете? 5000 предметов следует обрабатывать в мгновение ока.
Используете ли вы .NET 3.5? Если это так, LINQ может помочь вам в этом многом - в частности, использование ToLookup
с каждым свойством, в свою очередь, будет работать очень хорошо.