2010-08-15 27 views
1

我有一個循環,其循環多達20檢查循環中的增量器是否在一定範圍內的最佳方法是什麼?

我使用C#4.0LINQ(如有必要)。什麼是說

"if i > 3 && < 5"

但由於各種頻帶(例如3和5,6之間,和8等)的好方法,沒有負載,如果在循環語句?

感謝

+0

你想只是一個檢查,或多個的?即你是在說「如果它在範圍2-3或範圍5-7或範圍4-5做X」,或者你在說「如果範圍2-3做X,如果在範圍5- 7做Y,如果在範圍4-5做Z「?後者是 – Stephen 2010-08-15 12:17:14

+0

。因缺乏清晰度而變得不合時宜。 – dotnetdev 2010-08-15 12:26:34

+1

除了這些特定於樂隊的操作之外,循環還會執行其他任何操作嗎?這幾乎聽起來像你陷入了案件的反模式。 – 2010-08-15 12:54:38

回答

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); 
} 
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; 
} 
3

你仍然需要檢查這些值,所以最好的選擇我看到好像是要檢查的功能。這使得if子句非常乾淨,但仍然提供了靈活性來測試任何範圍。

bool inBand(int value, int low, int high) { 
    return value > low && value < high; 
} 
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 
} 
相關問題