Класс .NET, позволяющий быстрый поиск - PullRequest
1 голос
/ 29 марта 2012

Я ищу подходящий класс .NET, который позволяет мне хранить большое количество пользовательских записей, а затем искать экземпляр записи. Чтобы быть более конкретным, класс записи имеет 3 свойства, и я буду использовать один из них для поиска экземпляра. Количество сохраняемых экземпляров будет составлять до 100 000.

Я знаю о HastSetOf (MyRecord>, используемом с пользовательским IEqualityComarer. Суть в том, что при операции поиска я буду знать только один из реквизитов записи и на самом деле понадобятся два других значения реквизита.

Нужно ли мне DictionaryOf (строка, запись) или есть более быстрый?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Используйте класс Dictionary. В этом случае вам понадобятся три словаря: по одному на каждое свойство, по которому вы индексируете. Если свойства не уникальны, вместо этого вы захотите использовать Lookup.

var entriesById = entries.ToDictionary(e => e.Id);
var entriesByCategoryId = entries.ToLookup(e => e.CategoryId);

Console.WriteLine(entriesById[42].ToString());
foreach(var entry in entriesByCategoryId[13])
{
    Console.WriteLine(entry.ToString());
}
0 голосов
/ 29 марта 2012

Простой (и, вероятно, не самый эффективный для использования памяти) способ - сохранить записи в 3 отдельных хеш-таблицах (Dictionary) (по одной для каждой пары свойств) и просмотреть запись на основе рассматриваемого свойства

Другим способом может быть использование 3-кортежа в качестве ключа для карты (заполненного тремя рассматриваемыми свойствами) и использование собственного компаратора, который учитывает только соответствующий элемент в 3-кортеже на основе свойствадано для поиска

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

РЕДАКТИРОВАТЬ: добавлено конкретное имя класса для пояснения после того, как комментарий указал его

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