如何在数字范围的函数中优雅地赋值
本文关键字:赋值 函数 数字 范围 | 更新日期: 2023-09-27 18:27:43
我正在寻找一种优雅的方法来为属于特定范围的数字函数赋值。
例如,具有数字X的elegant way
将返回:
- "a"-如果X介于0和1000之间
- "b"-如果X在1000和1500之间
- 等等(但定义的间隔为固定数量)
我所说的优雅是指比更有吸引力的东西
if ((x => interval_1) && (x < interval_2))
class_of_x = 'a';
else if ((x => interval_2) && (x < interval_3))
class_of_x = 'b';
...
或
if(Enumerable.Range(interval_1, interval_2).Contains(x))
class_of_x = 'a';
else if(Enumerable.Range(interval_2 + 1, interval_3).Contains(x))
class_of_x = 'b';
...
我讨厌看到这么多国际单项体育联合会。此外,区间值可以存储在一个集合中(也许这会帮助我消除IS?),而不是interval_1、interval_2等。
受到这个问题的启发如何优雅地检查一个数字是否在一个范围内?其是在寻找上述问题的解决方案时出现的。
您可以创建扩展方法:
public static class IntExtensions
{
// min inclusive, max exclusive
public static bool IsBetween(this int source, int min, int max)
{
return source >= min && source < max
}
}
然后
// Item1 = min, Item2 = max, Item3 = character class
IList<Tuple<int, int, char>> ranges = new List<Tuple<int, int, char>>();
// init your ranges here
int num = 1;
// assuming that there certainly is a range which fits num,
// otherwise use "OrDefault"
// it may be good to create wrapper for Tuple,
// or create separate class for your data
char characterClass = ranges.
First(i => num.IsBetween(i.Item1, i.Item2)).Item3;
如果我的评论是正确的,那么你的第一个If语句有很多不必要的检查,如果它不小于间隔2,那么它必须大于或等于,因此:
if((x => i1) && (x < i2))
else if(x < i3)
else if(x < i4)...
当找到一个"true"参数时,if语句的其余部分就无关紧要了,只要你的条件符合要求,这应该符合你的需求
创建一个Interval类并使用LINQ:
public class Interval
{
public string TheValue { get; set; }
public int Start { get; set; }
public int End { get; set; }
public bool InRange(int x)
{
return x >= this.Start && x <= this.End;
}
}
public void MyMethod()
{
var intervals = new List<Interval>();
// Add them here...
var x = 3213;
var correctOne = intervals.FirstOrDefault(i => i.InRange(x));
Console.WriteLine(correctOne.TheValue);
}
首先,定义一个小类来保存包含的最大值,以及用于该波段的相应值:
sealed class Band
{
public int InclusiveMax;
public char Value;
}
然后声明一个Band
数组,该数组指定用于每个频带和循环的值,以找到任何输入的对应频带值:
public char GetSetting(int input)
{
var bands = new[]
{
new Band {InclusiveMax = 1000, Value = 'a'},
new Band {InclusiveMax = 1500, Value = 'b'},
new Band {InclusiveMax = 3000, Value = 'c'}
};
char maxSetting = 'd';
foreach (var band in bands)
if (input <= band.InclusiveMax)
return band.Value;
return maxSetting;
}
注意:在实际代码中,您可以将所有这些封装到一个类中,该类只初始化bands
数组一次,而不是每次调用它(就像上面的代码中一样)。
在这里,您还可以使用静态System.Linq.Enumerable的Range()方法来实现
IEnumerable<T>
使用Contains()方法(再次来自System.Linq.Enumerable),可以执行以下操作:
var num = 254;
if(Enumerable.Range(100,300).Contains(num)) { ...your logic here; }
至少在我眼里这看起来更优雅。