मैं एक अशक्त <DateTime> के साथ DateTime.TryParse का उपयोग कैसे करूं?


115

मैं एक स्ट्रिंग में डेटाइम मान को Nullable में प्राप्त करने के लिए DateTime.TryParse विधि का उपयोग करना चाहता हूं। लेकिन जब मैं यह कोशिश करता हूं:

DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);

संकलक मुझे बताता है

'आउट' तर्क को एक चर के रूप में वर्गीकृत नहीं किया गया है

निश्चित नहीं कि मुझे यहां क्या करना है। मैंने भी कोशिश की है:

out (DateTime)d.Value 

और वह भी काम नहीं करता है। कोई विचार?

जवाबों:


123
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;

(अधिक सुरुचिपूर्ण समाधान हो सकते हैं, लेकिन आप ऊपर दिए अनुसार कुछ क्यों नहीं करते?)


3
आप सही हैं, मैं इसे पूरा करने के लिए एक-लाइनर की तलाश कर रहा था, लेकिन मुझे लगता है कि यह करेगा। उस अस्थायी चर को बनाना पसंद नहीं है, गन्दा लगता है। : - / इस परिदृश्य की तरह बेहतर समर्थन किया जाना चाहिए।
ब्रायन सुलिवन

1
बाइनरी वॉरियर के सुझाव को एक विस्तार विधि में psuedo- इनलाइन करने के लिए देखें।
डेविड अल्परट

4
आप एक DateTime को DateTime को क्यों भेज रहे हैं? TryParse में इसे पास करने से पहले आपको d2 को रिकॉल करने की आवश्यकता नहीं है।
आरोन पॉवेल

@ सलाह - मैंने आपके सुझाव को शामिल करने के लिए उत्तर को अपडेट किया।
ड्रू नोक

@ जैसन केली मुझे आशा है कि यह पहले से ही वीएस २०२ में पेश किया गया है, अन्यथा मुझे इस अच्छे कोड का उपयोग करना जारी रखना होगा।
पिम्ता

161

जैसा कि जेसन कहते हैं, आप सही प्रकार का एक चर बना सकते हैं और पास कर सकते हैं। आप इसे अपने तरीके से इनकैप्सुलेट कर सकते हैं:

public static DateTime? TryParse(string text)
{
    DateTime date;
    if (DateTime.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}

... या यदि आप सशर्त ऑपरेटर को पसंद करते हैं:

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}

या C # 7 में:

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;

5
शायद मुझे स्कीट के साथ बहस नहीं करनी चाहिए, लेकिन ... आपको अपने तरीके को पार्स कहना चाहिए, क्योंकि मैं TryParse नामक एक विधि की कोशिश करूँगा, जिसमें ट्रिपपर्स सम्मेलन का पालन करने और बूलियन वापस करने की आवश्यकता होगी। ;-)
मिस्टर

@ मिस्टर: खैर न तो मामले में यह सटीक मौजूदा सम्मेलन का पालन करता है - जो लोग सिर्फ इसका इस्तेमाल करते थे, Parseवे उम्मीद करते हैं कि यह DateTimeअसफलता पर एक अपवाद छोड़ कर वापस आ जाएगा ? लेकिन हां, आप जो चाहें कर सकते हैं ... और नोडा टाइम में, मैंने Parseइसके बजाय संबंधित तरीकों का नाम दिया है ।
जॉन स्कीट

1
elseकीवर्ड अनावश्यक (अपने पहले उदाहरण में) के बाद से की अंत बिंदु है ifब्लॉक तक पहुँच कभी नहीं जा सकता है।
जेपी स्टिग नीलसन

1
@JeppeStigNielsen: हाँ, यह अनावश्यक है - लेकिन यह समरूपता के लिए शैलीगत रूप से बेहतर हो सकता है। यह सिर्फ एक व्यक्तिगत प्राथमिकता है (और मैं सुसंगत नहीं हूं, या तो ...)
जॉन स्कीट

3
@Kiquenet: अन्य का उपयोग करने से यह स्पष्ट हो जाता है कि एक या दूसरा रास्ता लिया जाएगा, और दोनों वापस लौटेंगे। मैं सामूहिक रूप से नेस्टेड कोड के खिलाफ हूं, लेकिन इस मामले में यह वास्तव में एक समस्या नहीं है IMO।
जॉन स्कीट

20

यहाँ जेसन ने जो सुझाव दिया उसका थोड़ा संक्षिप्त संस्करण है:

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;

18

आप नहीं कर सकते क्योंकि Nullable<DateTime>एक अलग प्रकार है DateTime। आपको इसे करने के लिए अपना स्वयं का फ़ंक्शन लिखना होगा,

public bool TryParse(string text, out Nullable<DateTime> nDate)
{
    DateTime date;
    bool isParsed = DateTime.TryParse(text, out date);
    if (isParsed)
        nDate = new Nullable<DateTime>(date);
    else
        nDate = new Nullable<DateTime>();
    return isParsed;
}

उम्मीद है की यह मदद करेगा :)

संपादित करें: (स्पष्ट रूप से) अनुचित रूप से परीक्षण किए गए विस्तार विधि को हटा दिया गया है, क्योंकि (कुछ खराब हूर द्वारा इंगित किए गए) विस्तार के तरीके जो "इस" पैरामीटर को बदलने का प्रयास करते हैं, मान प्रकार के साथ काम नहीं करेंगे।

PS खराब हूर प्रश्न में एक पुराना दोस्त है :)


हां न ही उस तारीख को रोकना चाहते हैं [जैसा कि आप इसे एक आउट परम के रूप में इस्तेमाल कर रहे हैं] ठीक है, मैं अचार खाना बंद कर दूंगा!
रूबेन बार्टलिंक

मुझ पर संकलक नहीं है, लेकिन जैसा कि डेटटाइम एक मूल्य प्रकार है, क्या विस्तार विधि संकलन को परिभाषित करता है?
रूबेन बार्टलिंक

जब तक आप इसे नहीं बना लेते हैं तब तक परिणाम नहीं आता है - [TestFixture] सार्वजनिक वर्ग जब भी {{परीक्षण] सार्वजनिक शून्य TryParseShouldWork () {DateTime? x = अशक्त; var res = Externders.TryParse (x, "1/1/1990"); Assert.IsTrue (res)
रूबेन बार्टेलिंक

; Assert.That (x! = Null); }} Assert.That पर विफल रहता है। अर्थात, परिणाम समय-समय पर संशोधित नहीं होता है क्योंकि डेटटाइम एक वैल्यू टाइप है (जो फोन स्क्रीन पर हमेशा एक अच्छा खरपतवार का सवाल होता है: D)
Ruben Bartelink

(पहले (गैर-विस्तार) obv एक काम करेगा, लेकिन इसे बाहर होना चाहिए, रेफरी नहीं - और आपको परिणाम को शून्य करना चाहिए अगर यह सामान्य रूप से TryXXX API के साथ फिट होने में विफल रहता है - बहुत यकीन है कि FDG उल्लेख करता है। मैं
चुनता

4

एक विस्तार विधि बनाने के बारे में क्या?

public static class NullableExtensions
{
    public static bool TryParse(this DateTime? dateTime, string dateString, out DateTime? result)
    {
        DateTime tempDate;
        if(! DateTime.TryParse(dateString,out tempDate))
        {
            result = null;
            return false;
        }

        result = tempDate;
        return true;

    }
}

2
वह पहला पैरामीटर क्या है dateTime, के लिए? इसका कभी उपयोग नहीं किया जाता है।
माइक जोबरे

1
@ मायिकेज़ - यह है कि कैसे विस्तार के तरीके काम करते हैं, इसका उपयोग कंपाइलर द्वारा यह जानने के लिए किया जाता है कि यह एक विस्तार विधि होनी चाहिए।
एरिक फनकेनबस

3
@MystereMan मुझे पता है कि एक विस्तार विधि क्या है। एक विस्तार विधि के लिए एक अधिक उपयुक्त हस्ताक्षर होगा DateTime? TryParse(this string dateString)। यह कार्यान्वयन सिर्फ विचित्र है।
माइक ज़ॉबरे

3
@ मायिकज़ - फिर आपने यह क्यों पूछा कि यह किस लिए था? जब आप केवल डेटाइम के लिए इसकी आवश्यकता हो, तो स्ट्रिंग नेमस्पेस को प्रदूषित क्यों करें? उद्देश्य DateTime.TryParse को एक अनुरूप दिनांक समय है कि प्रदान करना है .TryParse?
एरिक Funkenbusch

1
@ErikFunkenbusch यह एक्सटेंशन विधि किसी कॉल सिंटैक्स की तरह या की अनुमति नहीं देगा । तो माइक z सही है, यह विधि के लिए एक मूर्खतापूर्ण हस्ताक्षर है। (DateTime?).TryParse( ... )Nullable<DateTime>.TryParse( ... )
जेपी स्टिग नीलसन

1

मैं यह नहीं देखता कि Microsoft ने इसे क्यों नहीं संभाला। इससे निपटने के लिए एक स्मार्ट लिटिल यूटिलिटी मेथड (मुझे इंट के साथ इश्यू था, लेकिन डेटटाइम के साथ इंट को रिप्लेस करने का वही असर होगा, जो हो सकता है .....

    public static bool NullableValueTryParse(string text, out int? nInt)
    {
        int value;
        if (int.TryParse(text, out value))
        {
            nInt = value;
            return true;
        }
        else
        {
            nInt = null;
            return false;
        }
    }

1

यह एक लाइनर है जिसे आप देख रहे हैं:

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;

यदि आप इसे एक उचित TryParse छद्म विस्तार विधि बनाना चाहते हैं, तो आप यह कर सकते हैं:

public static bool TryParse(string text, out DateTime? dt)
{
    if (DateTime.TryParse(text, out DateTime date))
    {
        dt = date;
        return true;
    }
    else
    {
        dt = null;
        return false;
    }
}

@robnick मैंने जो कहा उससे अलग कैसे है?
cpcolella

1
मेरी पिछली टिप्पणी को अनदेखा करें (मैंने आपके समाधान को बढ़ा दिया है!), नवीनतम C # के लिए मुझे अशक्त डालने की आवश्यकता है: डेटाइम? d = DateTime.TryParse (blah, DateTime dt)? dt: (तारीख समय?) अशक्त;
4

1

यहाँ एक लाइन समाधान है:

DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;

-3

वैकल्पिक रूप से, यदि आप उठाए गए संभावित अपवाद से चिंतित नहीं हैं, तो आप Parse के लिए TryParse बदल सकते हैं:

DateTime? d = DateTime.Parse("some valid text");

हालाँकि, सफलता का संकेत देने वाला एक बूलियन नहीं होगा, यह कुछ स्थितियों में व्यावहारिक हो सकता है जहाँ आप जानते हैं कि इनपुट पाठ हमेशा मान्य होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.