To understand this code, you need to understand generics well. This is a functional implementation:
public class Range<TValue>
where TValue : IComparable<TValue>
{
public TValue Min { get; set; }
public TValue Max { get; set; }
public Range(TValue min, TValue max)
{
this.Min = min;
this.Max = max;
}
}
public class RangeComparer<TValue> : IRangeComparer<Range<TValue>, TValue>
where TValue : IComparable<TValue>
{
public int Compare(Range<TValue> range, TValue value)
{
if (range.Min.CompareTo(value) > 0)
return 1;
if (range.Max.CompareTo(value) < 0)
return -1;
return 0;
}
}
static void Main(string[] args)
{
var ranges = new Range<int>[]
{
new Range<int>(1, 10000),
new Range<int>(10001, 40000),
new Range<int>(40001, int.MaxValue),
};
var rangeComparer = new RangeComparer<int>();
Console.WriteLine(BinarySearch(ranges, 7, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 10007, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 40007, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 1, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 10000, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 40000, rangeComparer));
Console.WriteLine(BinarySearch(ranges, 40001, rangeComparer));
}
Do not forget that:
- ranges should be in increasing order
- ranges should not overlap
- indexes returned
BinarySearchare null based