Лучший способ представить эту таблицу поиска в C # - PullRequest
3 голосов
/ 17 марта 2009

Мне нужно представить таблицу поиска в C #, вот базовая структура:

Name    Range   Multiplier

Active  10-20   0.5

Что вы, ребята, предлагаете?

Мне нужно будет найти диапазон и получить множитель. Мне также нужно будет искать, используя имя.

UPDATE Всего будет 10-15 строк. Диапазон - целочисленный тип даты.

Ответы [ 4 ]

4 голосов
/ 17 марта 2009

На самом деле у вас есть две таблицы поиска: одна по имени и одна по диапазону. Есть несколько способов представить их в памяти в зависимости от размера таблицы.

Наиболее подходящим для поиска по имени является словарь:

var MultiplierByName = new Dictionary<string, double>() { {"Active",.5}, {"Other", 1.0} };

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

Оттуда вы можете выбрать другой словарь (Dictionary<int, double>), или, если он сработает правильно, вы можете сделать так, чтобы ваша функция Reduce возвращала последовательный int и использовала List<double>, чтобы ваш «ключ» просто стал индексом.

Но, как я уже сказал: чтобы точно знать, что лучше, нам действительно нужно знать объем и характер данных в поиске, а также сценарий, который вы будете использовать для доступа к нему.

3 голосов
/ 17 марта 2009

Создать класс для представления каждой строки. Он будет иметь свойства Name, RangeLow, RangeHigh и Multiplier. Создайте список таких строк (прочитанный из файла или введенный в код), а затем используйте LINQ для запроса к нему:

from r in LookupTable
where r.RangeLow <= x && r.RangeHigh >= x
select r.Multiplier;
2 голосов
/ 17 марта 2009

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

1 голос
/ 17 марта 2009

Я бы реализовал это, используя DataTable, предполагая, что не было особой причины использовать другой тип данных. DataTable.Select будет хорошо работать для поиска по имени или диапазону. Вы теряете некоторую производительность, используя для этого DataTable, но с 10-15 записями это будет иметь большое значение.

...