Doing a range lookup in C# - how to implement

前端 未结 1 1600
北海茫月
北海茫月 2020-12-20 09:11

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

1条回答
  •  没有蜡笔的小新
    2020-12-20 09:31

    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:

    • the ranges must be in ascending order
    • the ranges must not overlap
    • the indexes returned by BinarySearch are zero-based

    0 讨论(0)
提交回复
热议问题