Два ключа лучше, чем один - PullRequest
       15

Два ключа лучше, чем один

2 голосов
/ 06 февраля 2010

У меня есть класс виджетов:

public class Widget
{
    ...
    public string UniqueID = "856D9PWW";
    public int Price = 325;
    public byte[] Data;
    ...
}

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

Я не хочу использовать две структуры данных и использовать каждую из них, когда это необходимо, и удалять ее из другой, когда я удаляю ее из первой (это включает в себя создание моей собственной структуры данных, которая делает это «под прикрытием»). Мне бы хотелось иметь структуру данных, которая позволяет мне использовать несколько ключей, для этого нужно только удалить элемент из нее с помощью одного из ключей и иметь возможность хранить несколько элементов под одним из ключей.

Ответы [ 4 ]

7 голосов
/ 06 февраля 2010

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

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

4 голосов
/ 06 февраля 2010

Достаточно ли списка виджетов?

List<Widget> widgetList = new List<Widget>();

widgetList.Add(new Widget(UniqueID, price, data));

//To query by UniqueID
Widget uniqueWidget =  widgetList.Single(x => x.uniqueID.Equals("123"));

//To query by price
List<Widget> widgetsByPrice = widgetList.Where(x => x.price.Equals(100.00));

//To remove
widgetList.Remove(uniqueWidget);
0 голосов
/ 08 февраля 2010

Нет волшебного контейнера, который делает это. То, как системы баз данных обрабатывают это точно так же, как вы должны: иметь отдельный индекс для каждого метода доступа, который вам нужен. Да, это выглядит некрасиво, но это единственный способ индексировать несколько полей. Как уже упоминалось, вы можете инкапсулировать это в классе, который обрабатывает добавление и удаление элементов из каждого «индекса» для вас.

0 голосов
/ 06 февраля 2010

Для хранения ваших данных в реляционной базе данных вам нужна одна таблица, в которой хранятся все ваши данные виджета (при условии, что нет общих повторяемых данных, например, тип виджета, который должен храниться в таблице поиска - выполните поиск в Интернете). для нормализации базы данных).

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

Если вы имеете в виду структуру данных в коде, просто создайте класс списка, например

 public class Widgets : List<Widget>{


 } 

и реализуйте различные методы поиска в зависимости от ваших критериев поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...