2014-02-25 62 views
0

有一些方法當枚舉的值達到結束而增加或減少的值來自動回送。在C#中枚舉循環周圍

E.g.當使用DateTime.DayOfWeek它被定義爲:

public enum DayOfWeek 
{ 
    Sunday = 0, 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 3, 
    Thursday = 4, 
    Friday = 5, 
    Saturday = 6, 
} 

我在那裏我檢查,如果一個字符串數組昨天包含一個函數。

DateTime rn = DateTime.Now; 
string[] daysOfWeek = {"Monday", "Tuesday", "Saturday"}; 
if (daysOfWeek.Contains((rn.DayOfWeek - 1).ToString())) 
    ... 

如果今天是星期日。在這種情況下,有沒有辦法讓rn.DayOfWeek枚舉在開始到週六循環回去? 同樣,如果我添加,而不是減法,可以以某種方式循環結束從週六(6)回到週日(0)?

回答

4

你不應該添加/使用枚舉打交道時扣除。那是危險的地方。相反,你應該加/減日內回覆您的日期時間:

string today = DateTime.Now.DayOfWeek.ToString(); 
string tomorrow = DateTime.Now.AddDays(1).DayOfWeek.ToString(); 
string yesterday = DateTime.Now.AddDays(-1).DayOfWeek.ToString(); 
+0

完美的感謝,不知道我是怎麼錯過的。我可以使用'if(daysOfWeek.Contains((rn.AddDays(-1).DayOfWeek.ToString()))' – rboy

1

我在這個特殊的情況下,猜測它可能是

DateTime rn = DateTime.Now.AddDays(5); 
string[] daysOfWeek = { "Monday", "Tuesday", "Saturday" }; 
if (daysOfWeek.Contains(((rn.DayOfWeek) == 0 ? rn.DayOfWeek + 6 : rn.DayOfWeek - 1).ToString())) 
    Console.WriteLine("Found"); 

雖然我同意這樣的代碼一般不宜使用。

0

可以創建以下擴展方法(能夠容易地改變爲字符串數組)。

public static bool ContainsYesterday(this DayOfWeek[] days) 
{ 
    return days.Contains(DateTime.Now.AddDays(-1).DayOfWeek); 
} 

作爲以前的版本編輯有一個在評論中指定的錯誤。

+0

當你的第一個操作數是負數時,你知道'%'操作符是如何工作的嗎?減去'1')? –

+0

是的,測試它應該在C#中工作正常 – Grozz

+0

如果今天是'0'(星期天),並且你想測試昨天是否是'6'(星期六),該怎麼辦?你認爲' -1)%7 == 6'? –

0

沒有內置的方式做到這一點,但如果你滿意的整數工作那麼它很容易,你只是想從-X您的所有值重新映射到+ X爲0-6範圍,對於正值你會做

值+ 1(以重新映射到1-7的範圍,因爲我們要通過7分)7%(此爲您提供除以7餘數,那麼1%7 = 1 8 = 1等等,你已經得到它每7天循環)-1(重新映射1-7範圍到你的0-6枚舉值),並將其作爲你的枚舉進行強制轉換。

現在我們只需要考慮負值,並在將負值轉換爲前一個函數之前將其轉換爲正值。在這種情況下,我們希望將oposite天映射(-1相同+6,一天的一週開始前是一週等結束後6天),因此,如果您的值是負的,你想做的事ABS(值),使之積極和。減去從7將其重新映射到正數範圍

下面是一些代碼(未經測試)

if(value < 0) 
{ 
    value = 7 - Math.Abs(value) 
} 

value++; (remap 0-6 to 1-7) 
value = value % 7; (remap 1 - int.maxvalue to 1-7) 
value--; (remap 1-7 to 0-6; 

現在值包含映射到你的枚舉數。

+0

我建議你去Grozz的答案,這是更通用/更少的魔術數字 –

+0

因此技術上你可以使用'value =(DayOfWeek)((int)++ value%7 - 1);'right? – rboy

+0

@rboy Grozz的回答似乎並不正確,您在這裏的評論公式也沒有。你看到了我對GoldenCrystal的回答的評論;有一個簡潔而正確的公式。 –

1

你不能在隨機枚舉上有一個自動的「循環」行爲,但是,有一些方法可以處理你的問題。

大多數時候,你可以簡單地使用% operator,這在DayOfWeek的情況下將達到這樣的事:

// Prints Friday 
Console.WriteLine((DayOfWeek)(((int)DayOfWeek.Saturday + 6) % 7)); 

你也可以寫一個擴展方法,像這樣的:

public static class DateTimeExtensions 
{ 
    public static DayOfWeek AddDays(this DayOfWeek dayOfWeek, int count) 
    { 
     if (dayOfWeek < 0 || (int)dayOfWeek > 6) throw new ArgumentOutOfRangeException(); 

     int adjustedValue = ((int)dayOfWeek + count) % 7; 

     return (DayOfWeek)(adjustedValue < 0 ? adjustedValue + 7 : adjustedValue); 
    } 
} 

有了這個擴展方法,你可以做這樣的事情:

Console.WriteLine(DayOfWeek.Sunday.AddDays(-1)); // Prints "Saturday" 
Console.WriteLine(DayOfWeek.Sunday.AddDays(1)); // Prints "Monday" 
Console.WriteLine(DayOfWeek.Sunday.AddDays(7)); // Prints "Sunday" 
Console.WriteLine(DayOfWeek.Sunday.AddDays(-7)); // Prints "Sunday" 
+0

是的,這看起來不錯。因此,如果'dow'是'DayOfWeek',那麼可以通過'var dowBefore =(DayOfWeek)((dow - 1 + 7)%7);'我們有'+ 7'的地方肯定沒有subresult是消極的。當然它和'var dowBefore =(DayOfWeek)((dow + 6)%7);'數學上一樣。向後倒退1周的日子和向前倒退6個星期的日子是一樣的。 –

+1

好的一點,而不是做-1到一週的天,可以做+6(7-1),然後模7回到範​​圍內0到6.謝謝,這有助於我修復代碼的另一部分。 – rboy

+0

儘管這很有趣,但我試圖瞭解當您使用DateTime.DayOfWeek枚舉時,您的答案如何適合上述用例。一個人可以重載加法或減法運算符嗎? – rboy