Многократный ключевой поиск для словаря - PullRequest
3 голосов
/ 22 октября 2010

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

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

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

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

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

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

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

Dictionary<User, User>, затем внедрите IEqualityComparer<User>

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

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

Ответы [ 5 ]

1 голос
/ 22 октября 2010

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

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];
}
1 голос
/ 22 октября 2010

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

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

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

0 голосов
/ 22 сентября 2014

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

0 голосов
/ 22 октября 2010

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

0 голосов
/ 22 октября 2010

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

...