指定C#中的范围

本文关键字:范围 指定 | 更新日期: 2023-09-27 18:20:37

我有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?我该怎么做?

指定C#中的范围

您可以尝试制作一些小的匿名(或者不那么匿名,以便重用)函数:

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-9、10-19、20-29这样的连续范围实际上定义了一个"阈值点":9|10、19|20等等。您可以简单地:

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查找:

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

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

或者,使用此处发布的Interval数据类型,就像Marting在评论中暗示的那样。

您可以声明关于这个的类:

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();

如果变量result不为null,那么它就是您的最终结果。