我有一个循环,循环最多20个。
我正在使用 C#4.0 和 LINQ (必要时)。说什么是好方法
"if i > 3 && < 5"
但是对于各种波段(例如3到5,6和8之间等),在循环中没有if语句加载?
由于
答案 0 :(得分:3)
你仍然需要检查这些值,所以我看到最好的选择是否使检查成为一个功能。这使得if子句非常干净,但仍然可以灵活地测试任何范围。
bool inBand(int value, int low, int high) {
return value > low && value < high;
}
答案 1 :(得分:2)
您可以使用开关:
switch(i) {
case 3:
case 4:
case 5:
// between 3 and 5
break;
case 6:
case 7:
case 8;
// between 6 and 8
break;
case 9:
case 10:
case 11:
// between 9 and 11
break;
}
答案 2 :(得分:2)
如果您只想简化语法,可以编写扩展方法:
public static bool IsBetween(this int num, int exclusiveLowerBound, int exclusiveUpperBound)
{
return num > exclusiveLowerBound && num < exclusiveUpperBound;
}
当然,如果i.IsBetween(3, 5)
真的比你提供的样本更清洁,那就值得商榷。
如果你真的在处理“各种乐队”,你可以使用高效的Interval Tree数据结构。如果性能不是问题,您可以自己编写一个简单的类:
public class NumRange
{
public int ExclusiveLowerBound { get; private set; }
public int ExclusiveUpperBound { get; private set; }
public int Size
{
get
{
return ExclusiveUpperBound - ExclusiveLowerBound;
}
}
public NumRange(int boundary1, int boundary2)
{
ExclusiveLowerBound = Math.Min(boundary1, boundary2);
ExclusiveUpperBound = Math.Max(boundary1, boundary2);
}
public bool Contains(int num)
{
return num > ExclusiveLowerBound && num < ExclusiveUpperBound;
}
}
这将允许您编写如下代码:
var rangeToComment = new Dictionary<NumRange, string>
{
{new NumRange(3,5), "The number 4."},
{new NumRange(0, 10),"Single digit natural numbers"},
{new NumRange(int.MinValue,int.MaxValue),"Integers"}
};
foreach (int number in Enumerable.Range(0, 100))
{
var tightestRange = rangeToComment.Where(kvp => kvp.Key.Contains(number))
.OrderBy(kvp => kvp.Key.Size)
.First();
Console.WriteLine("{0}: {1}", number, tightestRange.Value);
}
答案 3 :(得分:1)
为了“隐藏”你的魔法数字,可能会使代码更清晰,你可以做这样的事情。这一切都取决于你的需求。
//By naming the rangeX variables something meaningful you can make your code more readable(in my mind).
var range1 = new int[] { 1, 2, 3 };
var range2 = new int[] { 4, 5 };
var range3 = new int[] { 6 };
for(int i = 0; i < 20; i++)
{
if(range1.Contains(i))
{
//Do stuff
}
else if(range2.Contains(i))
{
//Do other stuff
}
//etc
}