我有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?我该怎么做?
答案 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,那么这是你的最终结果。