Если вы хотите иметь возможность использовать что-то вроде lookup[10]
, как вы упомянули, вы можете создать свой собственный класс, который реализует какой-то тип данных ключ / значение.Какой тип данных вы в конечном итоге решите использовать, зависит от того, как ваши данные выглядят.
Вот простой пример того, как реализовать Dictionary<>
:
public class RangeLookup : Dictionary<(int Min, int Max), string>
{
public string this[int index] => this.Single(x => x.Key.Min <= index && index <= x.Key.Max).Value;
}
. Это позволяет вамопределить пользовательский индексатор поверх словаря, чтобы инкапсулировать ваш поиск диапазона.Использование этого класса будет выглядеть следующим образом:
var lookup = new RangeLookup
{
{ (1, 100), "In 100s" },
{ (101, 200), "In 101-200s" },
};
Console.WriteLine($"50: {lookup[50]}");
, который производит вывод как:
![enter image description here](https://i.stack.imgur.com/GwzB8.png)
В терминахНиже приведен пример некоторых тестов (использующих Win10 с процессором Intel i7-4770) для получения производительности из словаря с 10 000 000 записей:
var lookup = new RangeLookup();
for (var i = 1; i <= 10000000; i++)
{
var max = i * 100;
var min = max - 99;
lookup.Add((min, max), $"In {min}-{max}s");
}
var stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine($"50: {lookup[50]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");
stopwatch.Restart();
Console.WriteLine($"5,000: {lookup[5000]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");
stopwatch.Restart();
Console.WriteLine($"1,000,000,000: {lookup[1000000000]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");
, который дает следующие результаты:
![enter image description here](https://i.stack.imgur.com/ywaf4.png)
Таким образом, если вы не планируете работать с более чем десятками миллионов записей внутри этого набора данных, такой подход должен быть удовлетворительно с точки зрения производительности.