I\'m trying to understand how to implement the code found in thread by Jon Skeet: Doing a range lookup in C#?
Can someone provide an setup example using something l
You need to have a good grasp of generics to understand this code. Here’s a functional implementation:
public class Range
where TValue : IComparable
{
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 : IRangeComparer, TValue>
where TValue : IComparable
{
///
/// Returns 0 if value is in the specified range;
/// less than 0 if value is above the range;
/// greater than 0 if value is below the range.
///
public int Compare(Range range, TValue value)
{
// Check if value is below range (less than min).
if (range.Min.CompareTo(value) > 0)
return 1;
// Check if value is above range (greater than max)
if (range.Max.CompareTo(value) < 0)
return -1;
// Value is within range.
return 0;
}
}
static void Main(string[] args)
{
var ranges = new Range[]
{
new Range(1, 10000),
new Range(10001, 40000),
new Range(40001, int.MaxValue),
};
var rangeComparer = new RangeComparer();
Console.WriteLine(BinarySearch(ranges, 7, rangeComparer)); // gives 0
Console.WriteLine(BinarySearch(ranges, 10007, rangeComparer)); // gives 1
Console.WriteLine(BinarySearch(ranges, 40007, rangeComparer)); // gives 2
Console.WriteLine(BinarySearch(ranges, 1, rangeComparer)); // gives 0
Console.WriteLine(BinarySearch(ranges, 10000, rangeComparer)); // gives 0
Console.WriteLine(BinarySearch(ranges, 40000, rangeComparer)); // gives 1
Console.WriteLine(BinarySearch(ranges, 40001, rangeComparer)); // gives 2
}
Don’t forget that:
BinarySearch are zero-based