2

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

4

3 回答 3

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;
}
于 2013-07-02T09:29:31.173 回答
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 查找:

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

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

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

于 2013-07-02T09:29:39.423 回答
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();

如果变量结果不为空,这是您的最终结果。

于 2013-07-02T10:15:58.237 回答