2010-02-25 15 views
8

से मिनट तारीख/अधिकतम तारीख की गणना करें मैं एक सूची है जो तिथियां शामिल है:सी # - एक सूची

List<string> StringDates; 

    [0]: "04.03.2010" 
    [1]: "09.03.2010" 
    [2]: "11.03.2010" 
    [3]: "12.03.2010" 
    [4]: "16.03.2010" 
    [5]: "18.03.2010" 
    [6]: "19.03.2010" 
    [7]: "23.03.2010" 
    [8]: "25.03.2010" 
    [9]: "26.03.2010" 

सी # का उपयोग सबसे अच्छा/कम से कम इस सूची से मिनट तारीख/अधिकतम तारीख पता लगाने के लिए तरीका है क्या?

उत्तर

17

मुझे सरल समाधान पसंद है।

DateTime minDate = DateTime.MaxValue; 
DateTime maxDate = DateTime.MinValue; 
foreach (string dateString in StringDates) 
{ 
    DateTime date = DateTime.Parse(dateString); 
    if (date < minDate) 
     minDate = date; 
    if (date > maxDate) 
     maxDate = date; 
} 
+0

मैंने वास्तव में एक ही विधि लिखना शुरू किया, मुझे नहीं लगता कि 'ओ (एन)' समय को हरा करने के लिए बहुत कुछ किया जा सकता है जबतक कि आप इसे किसी प्रकार की ढेर संरचना में डाल दें जो आपको इसे 'ओ (लॉगएन)' में हल करने देता है। समय लेकिन फिर आप प्रोसेसर चक्रों का व्यापार करेंगे जो मेमोरी स्टोरेज को दोगुना करने के लिए आश्चर्यजनक रूप से सस्ते हैं जो अपेक्षाकृत कम सस्ते हैं। –

+1

@ जेफरी: स्ट्रिंग्स के रूप में प्रदर्शित तिथियों के लिए डेटाटाइम प्रारूप के वैश्वीकरण से सावधान रहें! – t0mm13b

+0

@ tommieb75 - हाँ, मैंने इसके बारे में सोचा, लेकिन इसमें शामिल नहीं किया, क्योंकि मैं आलसी था। उस हिस्से को मार्क बेयर्स के जवाब से लिया जा सकता है। मैं उसे ParseExact टुकड़े के लिए अपवर्तित कर दूंगा, और इसे पूरा कर दूंगा। :-) –

2

वाया Linq, आप कर सकते हैं:

from row in StringDates 
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
} 
+2

सूची एक 'सूची ' है हल करने के लिए इस के साथ आया था। न्यूनतम और अधिकतम तार आवश्यक रूप से न्यूनतम और अधिकतम तिथियों का प्रतिनिधित्व नहीं करेंगे। – LukeH

17

उपयोग LINQ !:

var list = new List<DateTime>(); 
    list.Add(new DateTime(2010, 1, 1)); 
    list.Add(new DateTime(2008, 1, 1)); 
    list.Add(new DateTime(2009, 1, 1)); 
    Console.WriteLine(list.Max(date => date)); 
    Console.WriteLine(list.Min(date => date)); 
24

ParseExact (या TryParseExact) का उपयोग करने के लिए उन्हें DateTime कन्वर्ट और फिर Linq का उपयोग न्यूनतम और अधिकतम प्राप्त करने के लिए:

List<DateTime> dates = StringDates 
    .Select(x => DateTime.ParseExact(x, "dd.MM.yyyy", null)) 
    .ToList(); 
DateTime minDate = dates.Min(); 
DateTime maxDate = dates.Max(); 

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

0

यह @ के समान है जेफरी का जवाब, लेकिन इसके बजाय प्रत्येक तिथि को पार्स की, यह पहली मिनट पाता है और अधिकतम अपनी स्ट्रिंग मानों की तुलना तारीखों, और फिर इसे अंत में मान पार्स करता है।

// This method handles the date comparisons 
private int WeirdComparer(string strDate1, string strDate2) 
{ 
    int res = string.Compare(strDate1, 6, strDate2, 6, 4); 
    if (res == 0) 
     res = string.Compare(strDate1, 3, strDate2, 3, 2); 
    if (res == 0) 
     res = string.Compare(strDate1, 0, strDate2, 0, 2); 
    return res; 
} 

public void FindMinAndMaxDates(IList<string> strDates, out DateTime minDate, out DateTime maxDate) 
{ 
    string min = "99.99.9999"; 
    string max = "00.00.0000"; 
    foreach (string strDate in strDates) 
    { 
     if (WeirdComparer(strDate, min) < 0) 
      min = strDate; 
     if (WeirdComparer(strDate, max) > 0) 
      max = strDate; 
    } 
    minDate = DateTime.ParseExact(min, "dd.MM.yyyy", null); 
    maxDate = DateTime.ParseExact(max, "dd.MM.yyyy", null); 
} 
+0

यह 'FindMinAndMaxDates' में इनपुट के रूप में' IList 'है। आप एक शून्य डेटटाइम का प्रतिनिधित्व कैसे करेंगे?एक नल स्ट्रिंग के रूप में? आपको नल तिथियों को संभालने के लिए केवल अजीब कॉम्पैयरर को बदलना होगा, नल तिथियों की तुलना के निरंतर अर्थपूर्ण का भी उपयोग करना होगा, और अंत में न्यूनतम/अधिकतम तिथि शून्य होने पर पारसीएक्सएक्ट को छोड़ दें। – Fede

+0

स्ट्रिंग का उपयोग न करें, केवल *** DateTime nullable *** type – Kiquenet

+1

का उपयोग करके उस स्थिति में आपको 'WeirdComparer' फ़ंक्शन की आवश्यकता नहीं है। आप 'डेटटाइम' के लिए डिफ़ॉल्ट तुलनाकर्ता का उपयोग करके आसानी से दूर हो सकते हैं। उदाहरण के लिए 'अगर (तुलनात्मक । डीफॉल्ट.कंपारेयर (शून्य करने योग्य दिनांक, मिनट) <0) '। – Fede

0

मुझे पता है कि यह आपके प्रश्न का सीधा जवाब नहीं है, लेकिन अगर वे यहां कुछ इसी तरह की तलाश में आते हैं तो दूसरों की मदद कर सकते हैं।

ऑब्जेक्ट्स की सूची से अधिकतम तारीख खोजने की कोशिश करते समय आज मैं इस मुद्दे पर भाग गया। कभी-कभी ऑब्जेक्ट्स की तारीख में कोई मूल्य नहीं होगा, इसलिए मुझे यह पता लगाना था कि मेरे linq के साथ प्रयास पार्स का उपयोग कैसे करें।

क्या मार्क here इस्तेमाल किया के संयोजन से मैं मेरी समस्या

 List<string> stringDates = new List<string>(); 
     stringDates.Add("Not a date"); 
     stringDates.Add("2015-01-01"); 
     stringDates.Add("2015-10-10"); 
     stringDates.Add("2015-9-10"); 
     stringDates.Add("123"); 

     DateTime sapInvoiceDate; 
     DateTime tempDate = DateTime.MinValue; 
     sapInvoiceDate = stringDates.Select(x => DateTime.TryParse(x, out tempDate)).Select(x => tempDate).Max(); 
संबंधित मुद्दे