2010-08-21 14 views
5

एक सरल कोड:बिट झंडे - मुझे क्या याद आ रही है?

protected void Page_Load(object sender, EventArgs e) 
{ 
    DateTime now = DateTime.UtcNow; 

    lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString(); 

    // weekdays (Saturday is not included) 
    DayOfWeek runningDays = DayOfWeek.Monday | DayOfWeek.Tuesday | DayOfWeek.Wednesday | DayOfWeek.Thursday | DayOfWeek.Friday; 

    lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek); 
    lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek); 
    lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0); 

    // weekend (Saturday is in a weekend) 
    runningDays = DayOfWeek.Saturday | DayOfWeek.Sunday; 

    lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek); 
    lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek); 
    lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0); 
} 

एक सहायक:

public static bool HasExactly(this DayOfWeek x, DayOfWeek y) { return x == y; } 
public static bool HasAny(this DayOfWeek x, DayOfWeek y) { return 0 != (x & y); } 
public static bool HasAll(this DayOfWeek x, DayOfWeek y) { return y == (x & y); } 

आज के उत्पादन (शनिवार)

now.DayOfWeek: Saturday 
True 
True 
True 
True 
True 
True 

लेकिन उत्पादन होना चाहिए की तरह:

now.DayOfWeek: Saturday 
False 
False 
False 
True 
True 
True 

Wh क्या मैं यहाँ लापता हूँ?

उत्तर

11

सप्ताह के दिन थोड़ा झंडे नहीं हैं। http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx

सप्ताह का दिन गणन में स्थिरांक का मान DayOfWeek.Sunday से DayOfWeek.Saturday के बीच है। यदि पूर्णांक में डाला गया है, तो इसका मान शून्य (जो DayOfWeek.Sunday को इंगित करता है) छः (जो DayOfWeek.Saturday इंगित करता है) से है।

+0

0 (रविवार) से 6 (शनिवार)। – sisve

+0

मुझे पता था कि मैं बेवकूफ था :(मुझे दस्तावेज़ों को इंगित करने के लिए धन्यवाद ... मैं भूल रहा हूं कि वे डेवलपर भूमिका का एक महत्वपूर्ण हिस्सा हैं ... लेकिन मैंने वास्तव में यह माना कि डेऑफविक एक ध्वज एनम था: ओ ( – balexandre

1

DayOfWeek में अनुक्रमिक संख्याएं हैं।

List<DayOfWeek> का उपयोग करें।

परिभाषा पर जाएं पता चलता है:

// Summary: 
//  Specifies the day of the week. 
[Serializable] 
[ComVisible(true)] 
public enum DayOfWeek 
{ 
    // Summary: 
    //  Indicates Sunday. 
    Sunday = 0, 
    // 
    // Summary: 
    //  Indicates Monday. 
    Monday = 1, 
    // 
    // Summary: 
    //  Indicates Tuesday. 
    Tuesday = 2, 
    // 
    // Summary: 
    //  Indicates Wednesday. 
    Wednesday = 3, 
    // 
    // Summary: 
    //  Indicates Thursday. 
    Thursday = 4, 
    // 
    // Summary: 
    //  Indicates Friday. 
    Friday = 5, 
    // 
    // Summary: 
    //  Indicates Saturday. 
    Saturday = 6, 
} 
+0

त्रुटि ... तो आप बिट ऑपरेटरों को लागू नहीं कर सकते हैं, जहां इस उदाहरण में उपयोग करने के लिए सबसे अच्छा है! – balexandre

+0

नहीं। लेकिन समय से पहले अनुकूलन प्रदर्शन बिंदु दृश्य से हो सकता है, दृश्यता बिंदु नहीं। सूची। संपर्क, आदि पढ़ने के लिए आसान हैं। –

2

आप अपनी खुद की dayOfWeek enum बना सकते हैं आप झंडे की तरह उपयोग करने की आवश्यकता है:

[Flags] 
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 }; 
+0

हाँ, मैं ऐसा कर रहा हूं :) लेकिन मैंने गलत तरीके से यह माना कि डेऑफविक एक ध्वज Enum था ... धन्यवाद। – balexandre

0

DayOfWeek गणन के एक दिन का प्रतिनिधित्व करने के लिए बनाया गया था सप्ताह, दिन का एक सेट नहीं।

आपको & का उपयोग करने के लिए एक कंपाइलर त्रुटि नहीं मिलती है क्योंकि enums पूर्णांक हैं, लेकिन ऑपरेटर जो भी आप उम्मीद करते हैं वह नहीं करता है (जब तक कि आप केवल सोमवार, मंगलवार या गुरुवार को कार्यक्रमों को शेड्यूल न करें)।

यदि आप थोड़ा झंडा चाहते हैं, तो रे सुझाव के अनुसार थोड़ा सा ध्वज प्रकार घोषित करें।

+0

हाँ ... मेरी गलती यह मान रही थी कि DayofWeek थोड़ा झंडा प्रकार था। .. यह मुझे कभी भी किसी अन्य तरीके से नहीं लेता है ... मुझे गूंगा :-( – balexandre

5

मैं जानता हूँ कि यह एक पुरानी पोस्ट है लेकिन सिर्फ मामले में - एक स्वच्छ वाक्य रचना झंडे enums करने के लिए

[Flags] 
public enum DaysOfWeek 
{ 
    None = 1 << 0, 
    Monday = 1 << 1, 
    Tuesday = 1 << 2, 
    Wednesday = 1 << 3, 
    Thursday = 1 << 4, 
    Friday = 1 << 5, 
    Saturday = 1 << 6, 
    Sunday = 1 << 7 
} 

है आप कोई भी कुछ भी नहीं की आवश्यकता होगी इंगित करने के लिए चुना गया था। इस तरह के एक enum उदाहरण के लिए, आप कई दिनों से संकेत मिलता है की अनुमति देता है:

var selectedDays = DaysOfWeek.Tuesday | DaysOfWeek.Friday; 

कोई टिप्पणी नहीं उम्मीद है कि जरूरत है। और क्रम में "डिकोड" के लिए मूल्य:

public bool IsDayOfWeekSelected(DaysOfWeek which, DaysOfWeek selection) 
{ 
    return selection & which == which; 
} 

और यह तो हमें फोन कर सकते हैं:

var isTuesday = IsDayOfWeekSelected(DaysOfWeek.Tuesday, selectedDays); // => true 
var isWednesday = IsDayOfWeekSelected(DaysOfWeek.Wednesday, selectedDays); // => false 
var isFriday = IsDayOfWeekSelected(DaysOfWeek.Friday, selectedDays); // => true 

आशा इस कोई मदद करता है।

+1

मैं एक्सटेंशन विधि के साथ जाऊंगा, जैसे कुछ: 'सार्वजनिक स्थैतिक बूल IsDayOfWeek चयनित (इस दिन OfWeek चयनित दिन, DaysOfWeek जो) {वापसी चयन और wh ich == जो; } 'तो आप आसानी से बस कर सकते हैं:' चयनित दिन। IDayOfWeek चयनित (DaysOfWeek.Tuesday); '; ओ) – balexandre

+0

अच्छा बिंदु। उन्हें आपको यूटिलिटी क्लास में सामान भरना नहीं है :) –

+0

मैं हमेशा 'कोई नहीं' 0 को डिफ़ॉल्ट करता हूं, और आप .NET ' DayOfWeek' –

संबंधित मुद्दे