在C#中指定范围

时间:2013-07-02 09:22:02

标签: c#

我有6个范围:

1000000-5000000
50000001-10000000
10000001-25000000
25000001-50000000
50000001-75000000
75000001-100000000

现在怎么说:

var range1 = 1000000-50000000;
var range2 = 50000001-10000000;
int limit = 10000000;

if(limit and range1)
{
     result = 10;
}
else if(limit and range2)
{
     result = 20;
}

所以我要说的是,如果存在限制和范围1的组合,那么结果是10?我该怎么做?

3 个答案:

答案 0 :(得分:13)

您可以尝试制作一些匿名(或不那么匿名,重复使用)功能:

Func<int, bool> range1 = i => (1000000 >= i) && (i <= 50000000);
Func<int, bool> range2 = i => (50000001 >= i) && (i <= 10000000);
Func<int, bool> limit =  i => i <= 10000000;

var test = 2000000;

if(limit(test) && range1(test))
{
     result = 10;
}
else if(limit(test) && range2(test))
{
     result = 20;
}

答案 1 :(得分:3)

如果你的范围是连续的,就像你给出的例子一样,那么请注意你不需要任何“间隔”。

1-9,10-19,20-29等连续范围实际上定义了“阈值点”:9 | 10,19 | 20等等。您可以简单地:

,而不是检查1-9,10-19,20-29范围
if ( x <= 9 )
   ...
else if ( x <= 19 )
   ...
else if ( x <= 29 )
   ...

请注意else部分保证每种情况下限。

编辑:

您已使用result = 10等更新了代码。如果您真的只需要这么简单的操作,那么您可以定义一个列表:

var levelsAndValues = List<Tuple<int, int>>();
levelsAndValues.Add(Tuple.Create(5000000, 10));
levelsAndValues.Add(Tuple.Create(10000000, 20));
...

并在其上运行一个简单的循环:

int limit = 1000000;
int result = 0;
foreach(var level in levelsAndValues)
    if(limit > level.Item1)
        result = level.Item2;
    else
        break;

或linq-lookup:

var result = levelsAndValues.Where(level => limit > level.Item1)
                            .Select(level => level.Item2)
                            .LastOrDefault();

现在,如果你的范围是不连续的 - 你只需要向元组引入第三个值:{low,high,value}而不是像我上面写的那样只是{high,value},然后相应地更新过滤。这可能是将Tuple更改为自定义类型的好时机。

或者,使用Interval datatype posted here,就像Marting在评论中暗示的那样。

答案 2 :(得分:2)

您可以声明关于此的课程:

public class Range
{
    public int Min { get; set; }
    public int Max { get; set; }
    public int Limit { get; set; }
    public int Result{get;set;}

    public Range(int min, int max, int limit, int result)
    {
        this.Min = min;
        this.Max = max;
        this.Limit = limit;
        this.Result = result;
    }

    public bool InRange(int value)
    {
        if (value >= this.Min && value <= this.Max && value <= limit)
            return true;
        return false;
    }
}

并使用此类,如:

List<Range> rangeList = new List<Range>();
        rangeList.Add(new Range(1000000, 5000000, 10000000, 10));
        rangeList.Add(new Range(5000001, 10000000, 10000000, 20));
        int? result = rangeList.Where(t => t.InRange(value)).Select(t => t.Result).FirstOrDefault();

如果变量结果不为null,那么这是你的最终结果。