代码之家  ›  专栏  ›  技术社区  ›  Steve Dignan

确定一个数字是否在指定的范围内

  •  18
  • Steve Dignan  · 技术社区  · 17 年前

    int x = 500; // Could be any number
    
    if ( ( x > 4199 && x < 6800 ) ||
         ( x > 6999 && x < 8200 ) ||
         ( x > 9999 && x < 10100 ) ||
         ( x > 10999 && x < 11100 ) ||
         ( x > 11999 && x < 12100 ) )
    {
        // More awesome code
    }
    

    7 回复  |  直到 17 年前
        1
  •  36
  •   alldayremix    11 年前

    扩展方法?

    bool Between(this int value, int left, int right)
    { 
       return value > left && value < right; 
    }
    
    if(x.Between(4199, 6800) || x.Between(6999, 8200) || ...)
    

    你也可以做这个可怕的黑客:

    bool Between(this int value, params int[] values)
    {
        // Should be even number of items
        Debug.Assert(values.Length % 2 == 0); 
    
        for(int i = 0; i < values.Length; i += 2)
            if(!value.Between(values[i], values[i + 1])
                return false;
    
        return true;
    }
    
    if(x.Between(4199, 6800, 6999, 8200, ...)
    

    糟糕的黑客,改进:

    class Range
    {
        int Left { get; set; }
        int Right { get; set; }
    
        // Constructors, etc.
    }
    
    Range R(int left, int right)
    {
        return new Range(left, right)
    }
    
    bool Between(this int value, params Range[] ranges)
    {
        for(int i = 0; i < ranges.Length; ++i)
            if(value > ranges[i].Left && value < ranges[i].Right)
                return true;
    
        return false;
    }
    
    if(x.Between(R(4199, 6800), R(6999, 8200), ...))
    

    bool Between(this int value, Dictionary<int, int> ranges)
    {
        // Basically iterate over Key-Value pairs and check if value falls within that range
    }
    
    if(x.Between({ { 4199, 6800 }, { 6999, 8200 }, ... }
    
        2
  •  14
  •   Scott Lawrence    14 年前

    您对它们感兴趣:

    static readonly Range InvalidUser = new Range(100, 200);
    static readonly Range MilkTooHot = new Range (300, 400);
    
    static readonly IEnumerable<Range> Errors =
        new List<Range> { InvalidUser, MilkTooHot };
    
    ...
    
    // Normal LINQ (where Range defines a Contains method)
    if (Errors.Any(range => range.Contains(statusCode))
    // or (extension method on int)
    if (statusCode.InAny(Errors))
    // or (extension methods on IEnumerable<Range>)
    if (Errors.Any(statusCode))
    

    您可能对通用型感兴趣 Range MiscUtil

    foreach (DateTime date in 19.June(1976).To(25.December(2005)).Step(1.Days()))
    {
        // etc
    }
    

        3
  •  7
  •   Scott Ivey    17 年前

    int x = 500; // Could be any number
    if ( ( 4199 < x && x < 6800 ) ||
         ( 6999 < x && x < 8200 ) ||
         ( 9999 < x && x < 10100 ) ||
         ( 10999 < x && x < 11100 ) ||
         ( 11999 < x && x < 12100 ) )
    {
        // More awesome code
    }
    
        4
  •  3
  •   Rob Cowell    17 年前

    LINQ方法:

    using System.Linq;
    
            /// <summary>
            /// Test to see if value is in specified range.
            /// </summary>
            /// <param name="aStart">int</param>
            /// <param name="aEnd">int</param>
            /// <param name="aValueToTest">int</param>
            /// <returns>bool</returns>
            public static bool CheckValueInRange(int aStart, int aEnd, int aValueToTest)
            {
                // check value in range...
                bool ValueInRange = Enumerable.Range(aStart, aEnd).Contains(aValueToTest);
                // return value...
                return ValueInRange;
            }
    
        5
  •  1
  •   Bob    17 年前
    class Range { 
    
        public Range(int x, int y) {
            X = x;
            Y = y;
        }
    
        public int X { get; set; }
        public int Y { get; set; }
    }
    
    var ranges = new List<Range>();
    ranges.Add(new Range(4199,6800));
    ranges.Add(new Range(6999,8200));
    ranges.Add(new Range(9999,10100));
    ranges.Add(new Range(10999,11100));
    ranges.Add(new Range(11999,12100));
    
    bool inRange = ranges.Count(r => x >= r.X && x <= r.Y) > 0;
    //or -- Based on Jons recommendation
    bool inRange = ranges.Any(r => x >= r.X && x <= r.Y);
    
        6
  •  0
  •   KM.    17 年前

    if ( x>max_lower && x <min_upper)
    {
        // More awesome code
    
    }
    
        7
  •  0
  •   LBushkin    17 年前

    尝试以下内容:

    struct Range
    {
       public readonly int LowerBound;
       public readonly int UpperBound; 
    
       public Range( int lower, int upper )
       { LowerBound = lower; UpperBound = upper; }
    
       public bool IsBetween( int value )
       { return value >= LowerBound && value <= UpperBound; }
    }
    
    public void YourMethod( int someValue )
    {
       List<Range> ranges = {new Range(4199,6800),new Range(6999,8200),
                             new Range(9999,10100),new Range(10999,11100),
                             new Range(11999,12100)};
    
       if( ranges.Any( x => x.IsBetween( someValue ) )
       {
          // your awesome code...
       }
    }
    
        8
  •  -1
  •   Why...because.its.free    14 年前