C #: Использование хеш-таблиц для хранения двух одинаковых значений.Является ли это возможным? - PullRequest
1 голос
/ 16 октября 2010

Я довольно новичок в программировании на C #, и я написал программу, которая использует хеш-таблицы для хранения данных (в моем случае это имя пользователя, и если они «Готов» или «Не готов». итого. Первая таблица содержит ключ в качестве имени пользователя и IP-адрес клиента в поле значения, вторая таблица имеет статус «Готов / не готов» (заданный в поле со списком) для ключа, а IP-адрес - в качестве значение.

Первая таблица не является проблемой, так как я не хочу, чтобы имя пользователя повторялось. Однако во второй таблице мне нужно, чтобы состояние «Готов / Не готов» повторялось много раз. Однако это не работает, так как говорит, что в хеш-таблице уже есть ключ «Готово». Есть ли какой-нибудь способ обойти это?

Ответы [ 5 ]

3 голосов
/ 16 октября 2010

Вы можете использовать Dictionary<Status,HashSet<IP>> для второй таблицы.Это дает дополнительное преимущество, заключающееся в том, что вставка / удаление IP-адреса происходит быстро, поскольку это ключ в HashSet.

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

Итак, причина второй хеш-таблицы в том, чтобы быстро посмотреть, кто готов или нет, правильно?

В этом случае рассмотрите возможность разделения этого на 2 разные коллекции: одну для тех, кто готов, и одну для тех, кто не готов.

Скорее всего, здесь будет просто Список , так как вам просто нужно увидеть, кто там, а не найти конкретного (потому что, если вы хотите это сделать, вы можно было бы просто посмотреть в другой хеш-таблице). Если важно иметь свойства поиска, аналогичные хеш-таблице, вы можете использовать взамен HashSet , но это зависит от ваших потребностей.

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

Хорошо, я наконец понял это.У меня есть 3 таблицы.Первый ключ: Имя пользователя Значение: IP.Второй ключ: значение IP: имя пользователя.Третий ключ: имя пользователя Значение: готов / не готов.Тогда я просто ссылаюсь на htReady.Value (хеш-таблицу).Весь мой код здесь: http://pastebin.com/Z60GEjK8. Части, на которые вы хотите обратить внимание, это начало класса ChatServer, AddUser, RemoveUser и AcceptClient.

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

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

Похоже, что Hashtable, вероятно, не идеальная структура данных для вашей проблемы.

Ключи в хеш-таблице / словаре должны быть уникальными, поэтому нет, технически вы не можете хранить две записи в хеш-таблице, которыеиспользуйте тот же ключ.

Кроме того, вам, вероятно, следует использовать Dictionary<TKey, TValue) вместо фактического типа Hashtable, так как он имеет лучшие характеристики производительности.

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

// Map containing two sets of IP addresses: those that are ready, 
// and those that are not ready.
var readyMap = new Dictionary<bool, HashSet<string>>();
readyMap[true] = new HashSet<string>();
readyMap[false] = new HashSet<string>();

// Add an IP address that is ready.
readyMap[true].Add(ipAddress1);

// Add an IP address that is not ready.
readyMap[false].Add(ipAddress2);

Однако это может быть не идеальным решением.Какую именно проблему вы пытаетесь решить?

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

Ключи должны быть уникальными. Если бы вы попытались получить доступ к значению по ключу, как бы оно узнало, какое из них вам действительно нужно?

...