2010-10-21 2 views
3

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

У меня есть User Entity, который имеет name, email и id, типы не имеют значения.

Я хотел бы сохранить его в Dictionary<User, id>, чтобы получить идентификатор пользователя, просмотрев его с помощью пользователя.

Я также хочу наоборот, то есть: Dictionary<Id, User>

Я могу создать две структуры и делать поиск. Это легко. Я хотел бы сделать это с единой структурой.

Мне интересно, если я могу сделать это с помощью одной структуры

Я думал, что я могу сделать:

Dictionary<User, User>, а затем реализовать IEqualityComparer<User>

Есть ли лучший способ сделать это ?

Что было бы лучшей практикой для внедрения IEqualityComparer?

+0

Так как id является свойством объекта User, вы просто делаете user.id, когда хотите получить идентификатор от определенного объекта. Но я думаю, вы хотите сделать обратное, даже если id не является общедоступным? –

+0

Я не думаю, что понял, что я спросил. Я могу сохранить пользовательский объект в качестве ключа, тогда я не могу найти поиск только по id. – DarthVader

ответ

1

Если вам нужно сделать этот тип сопоставления или нет, вы можете использовать один словарь для чего-то вроде того, о чем вы просите. Вот пример:

var dict = new Dictionary<string, object>(); 
dict["ID_001"] = new User(); 
dict["USER_??"] = 001; // Need a unique user string to replace the "??" 

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

User GetUser(int id, Dictionary<string, object> dict) 
{ 
    return (User)dict["ID_" + id]; 
} 
+0

это умный и должен работать. Как насчет без hardcoding любой строки? – DarthVader

+0

@ user177883: Тогда вы получите в основном словарь <объект, объект> **. Вероятно, это не стоило бы того. –

0

Поскольку вы храните идентификатор в объекте User, вам не нужно сопоставлять идентификатор пользователя и>.

+0

Да, я могу его сохранить. и он там, если на то пошло. – DarthVader

1

Я не уверен, что ваше описание проблемы имеет смысл, по следующей причине:

Учитывая User объект, который вы знаете ID, как ID является собственностью пользователя. Поэтому, зачем вам понадобится Dictionary<User, Id>? Если у вас есть Dictionary<Id, User>, вы можете получить доступ к пользователю с идентификатором, и если у вас есть пользователь, у вас уже должен быть ID, что делает ненужным другой словарь.

Или это случай, когда иногда у вас есть неполный объект User с Id, который не заполнен?

+0

В какой-то момент я знаю пользователя {имя и адрес электронной почты}, но не идентификатор, и в какой-то момент я знаю идентификатор пользователя, но не User {name и email}. имеет смысл? – DarthVader

+0

В этом случае вам кажется, что вам нужны два словаря: один, который ищет по электронной почте (конкатенируйте имя, а также, если адрес электронной почты не является уникальным) и тот, который выполняет поиск по идентификатору. Вам не нужно (или желательно использовать накладные расходы) для использования всего объекта User в качестве ключа. Я был бы склонен использовать два словаря: он прост и чист. Вы можете уйти с сохранением одного и того же объекта дважды в словаре, используя тип ключа, который может представлять собой адрес электронной почты или идентификатор, но я не вижу, что вы покупаете. – mtreit

0

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

+0

Да, это легко. Я думаю, я не могу получить его с помощью пользовательского компаратора. – DarthVader

0

Я знаю, этот вопрос стар, но он пришел на поиск Google Я просто сделал, и я не был счастлив с верхним ответом. Я бы предложил использовать Tuple в качестве ключа в словаре. Если имя и адрес электронной почты являются строками, а id - int, то это может быть Tuple

+1

Ваш ответ должен содержать пример кода. –