检查循环中增量是否在一定范围内的最佳方法是什么?

时间:2010-08-15 12:12:05

标签: c#

我有一个循环,循环最多20个。

我正在使用 C#4.0 LINQ (必要时)。说什么是好方法

"if i > 3 && < 5"

但是对于各种波段(例如3到5,6和8之间等),在循环中没有if语句加载?

由于

4 个答案:

答案 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
}