Najszybszy sposób wyszukiwania numeru na liście zakresów
Mam następujący kod, aby znaleźć dopasowanie dla numeru na liście zakresów.
public class RangeGroup
{
public uint RangeGroupId { get; set; }
public uint Low { get; set; }
public uint High { get; set; }
// More properties related with the range here
}
public class RangeGroupFinder
{
private static readonly List<RangeGroup> RangeGroups=new List<RangeGroup>();
static RangeGroupFinder()
{
// Populating the list items here
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023238144, High = 1023246335 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023246336, High = 1023279103 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023279104, High = 1023311871 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023311872, High = 1023328255 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023328256, High = 1023344639 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023344640, High = 1023410175 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023410176, High = 1023672319 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023672320, High = 1023688703 });
RangeGroups.Add(new RangeGroup { RangeGroupId = 0, Low = 1023692800, High = 1023696895 });
// There are many more and the groups are not sequential as it can seen on last 2 groups
}
public static RangeGroup Find(uint number)
{
return RangeGroups.FirstOrDefault(rg => number >= rg.Low && number <= rg.High);
}
}
Lista RangeGroup składa się z około 5000000 elementów, a metoda Find () będzie używana bardzo często, więc szukam szybszego sposobu wyszukiwania. Nie ma problemu, aby zmienić strukturę danych lub podzielić je w jakikolwiek sposób.
Edytować:
Wszystkie zakresy są niepowtarzalne i dodawane w kolejności od Niskiej i nie pokrywają się.
Wynik:
Zrobiłem test używająckod ikh a wynik jest około 7000 razy szybszy niż mój kod. Kod testu i wyniki można zobaczyćtutaj.