2012-03-12 12 views
6

मैं एक ग्राफ को कवर किया है कि "1930-1940", "1940-1950", "1950-1960", "1960-1970", ...क्या टाइमस्पेन के साथ दशकों का प्रतिनिधित्व करने का यह सबसे अच्छा तरीका है?

मैं एक DateTime और एक Timespan के साथ इस का प्रतिनिधित्व करना चाहते हैं बना रही हूँ, लेकिन मैं वास्तव में यकीन है कि TimeSpan बनाने के लिए कैसे नहीं कर रहा हूँ, और मैं इसे मुश्किल मेरे timespans यदि सत्यापित करने के लिए लगता है सही हैं।

क्या यह है कि मुझे TimeSpan का उपयोग करना चाहिए, या यह ओवरलैप करता है? अगर यह ओवरलैपिंग हो रहा है तो मैं इसे कैसे ठीक कर सकता हूं?

List<DateTime> list1 = new List<DateTime>(); 
List<TimeSpan> list2 = new List<TimeSpan>(); 

int startYearInt = 1930; 

int times = 0; 
const int intervalSize = 10; 
for (int i = startYearInt; i < 2020; i += intervalSize) 
{ 
    DateTime sYear = new DateTime(startYearInt + (intervalSize * times++), 1, 1); 
    TimeSpan period = (sYear.AddYears(intervalSize)) - sYear; 

    list1.Add(sYear); 
    list2.Add(period); // <<-- Don't know if if this is correct? 
} 

संपादित करें: मेरे पास यह भी है। और यदि मेरा टाइमपैन बहुत छोटा है या आखिरी है तो कुछ समस्याएं दे सकती हैं।

public bool IsInsidePeriod(DateTime dt) 
{ 
    return dt >= FromYearDateTime && dt < FromYearDateTime.Add(periodTimeSpan); 
} 
+0

कारण है कि आप सिर्फ उन्हें ints के रूप में प्रतिनिधित्व नहीं करते? –

+0

क्यों दिनांक समय _and_ TimeSpan? आपको बस n + 1 दिनांक समय मान है। –

+4

एक 'TimeSpan' बस और की राशि है समय, समय में किसी भी बिंदु से जुड़ा नहीं है (10 साल की अवधि सिर्फ यही है - यह 10 की अवधि हो सकती है एक शताब्दी पहले या एक सहस्राब्दी साल)। – Oded

उत्तर

7

आप एक DateTime और एक TimeSpan उस तरह का उपयोग करने से एक DateRange मान प्रकार बनाने से बेहतर कर रहे हैं। उदाहरण के लिए here देखें। उसके बाद आप एक फैक्ट्री विधि कर सकते हैं जो आपको एक दशक के लिए एक रेंज देता है: । इस तरह, आप अवशोषण का स्तर बढ़ाते हैं और उन अवधारणाओं से निपटते हैं जिनका आप को कोड पर संदर्भित कर रहे हैं।

आपका IsInsidePeriodDateRange के लिए एक सरल ऑपरेशन है:

public bool Includes(DateTime date) { 
    return start <= date && date <= end; 
} 

(यह मानते हुए कि दोनों start और endसमावेशी कर रहे हैं)

अब, अगर आप केवल दशकों से निपटने के लिए की जरूरत है, तो आप वास्तव में पूर्ण DateRange कक्षा की आवश्यकता नहीं है, बस यह:

class Decade { 

    public int StartYear { get; private set; } 
    public int EndYear { get { return StartYear + 9; } } 

    public Decade(int startYear) { 
    StartYear = startYear; 
    } 

    public bool Includes(DateTime date) { 
    return StartYear <= date.Year && date.Year <= EndYear; 
    } 

    public override string ToString() { 
    return string.Format("{0}-{1}", StartYear, EndYear + 1); 
    } 

} 

या शायद अधिक सामान्य YearRange

+0

एक दशक 10 की अवधि है, आपका दशक कोड काम नहीं करता है :-) – Lloyd

+1

@Lloyd एक दशक का अंत वर्ष प्रारंभ वर्ष के 9 साल बाद है। 10 साल बाद एक और दशक की शुरुआत होगी – RichK

0

आप कुछ इस तरह करने के लिए अपने IsInPeriod विधि को सरल बनाने के कर सकते हैं:

public bool IsInsidePeriod(DateTime dateToCompare, DateTime startDate, DateTime endDate) 
{ 
    return startDate <= dateToCompare && dateToCompare < endDate; 
} 

दूसरों का उल्लेख किया है के रूप में, TimeSpan आप कुछ भी खरीद नहीं है और अपने वर्णित मुद्दा overcomplicating है। तुलना ऑपरेटर पर विशेष ध्यान दें। आप या तो समावेशी या इसके विपरीत के बजाय अनन्य होना चाहते हैं।

1

यदि आप जो कुछ करने के लिए कह रहे हैं वह आपके वर्तमान मुद्दों को हल कर रहा है तो नीचे दिया गया कोड काम करता है, हे, मैं ऊब गया हूं, हालांकि, मैं डेटटाइम श्रेणियों, तुलनाओं (विशेष रूप से विभिन्न टाइमज़ोन आदि के साथ काम कैसे करता हूं) पर कुछ शोध करने पर विचार करता हूं। अंतराल।

DateTime on MSDN

class Program 
{ 
    static void Main(string[] args) 
    { 
     int interval = 10; 
     DateTime isInRangeDate = DateTime.UtcNow; 

     for (int i = 1930; i < 2020;) 
     { 
      DateRange range = new DateRange(1, 1, i, interval); 
      Console.WriteLine(string.Format("{0}: Is in range - {1}", range.ToString(), range.IsInsidePeriod(isInRangeDate))); 


      i = range.EndDate.Year; 
     }    

     Console.ReadLine(); 
    } 
} 


public class DateRange 
{ 
    public DateTime StartDate { get; private set; } 
    public DateTime EndDate { get; private set; } 

    public override string ToString() 
    { 
     return string.Format("{0}-{1}", this.StartDate.Year, this.EndDate.Year); 
    } 

    public DateRange(int day, int month, int year, int addYears) 
    { 
     StartDate = new DateTime(year, month, day, 0, 0, 0); 
     EndDate = StartDate.AddYears(addYears); 
    } 

    public bool IsInsidePeriod(DateTime dt) 
    { 
     return ((dt.Date >= StartDate) && (dt.Date < EndDate)); 
    } 
} 
संबंधित मुद्दे

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