指定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?我该怎么做?
您可以尝试制作一些小的匿名(或者不那么匿名,以便重用)函数:
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,那么它就是您的最终结果。