আমি কীভাবে ডেটটাইমটি ব্যবহার করব? একটি নুলযোগ্য <ডেটটাইম> এর সাথে ট্রাই পার্স করুন?


115

আমি একটি স্ট্রিংয়ের ডেটটাইম মানকে একটি নালায় পরিণত করতে ডেটটাইম.ট্রি পার্স পদ্ধতি ব্যবহার করতে চাই। তবে যখন আমি এটি চেষ্টা করি:

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
আপনি ঠিক বলেছেন, এটি সম্পন্ন করার জন্য আমি আরও অনেক বেশি ওয়ান-লাইনারের সন্ধান করছিলাম তবে আমি মনে করি এটি কাজটি করবে। অস্থায়ী পরিবর্তনশীল তৈরি করা পছন্দ করবেন না, অগোছালো মনে হয় feels : - / মনে হয় এই দৃশ্যের মতো আরও ভাল সমর্থন করা উচিত।
ব্রায়ান সুলিভান

1
বাইনারি ওয়্যারিয়ারের প্রস্তাবিত পেজ-ইনলাইনটি বর্ধিত পদ্ধতিতে দেখুন ued
ডেভিড আল্পার্ট

4
আপনি কেন একটি ডেটটাইমকে একটি ডেটটাইম কাস্ট করছেন? ট্রাইপার্সে পাস করার আগে আপনাকে ডি 2 পুনরায় লাগাতে হবে না।
অ্যারন পাওয়েল

@ স্লেস - আপনার পরামর্শটি অন্তর্ভুক্ত করার জন্য আমি উত্তরটি আপডেট করেছি।
ড্রউ নোকস

@ জেসন কেলে আমি আশা করি এটি ইতিমধ্যে ভিএস ২০১২ তে প্রবর্তিত হয়েছে, অন্যথায় আমাকে এই ভাল কোডের ব্যবহার চালিয়ে যেতে হবে।
পিমেন্টা

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;
}

বা সি # 7 এ:

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

5
স্কিটির সাথে আমার সম্ভবত তর্ক করা উচিত নয়, তবে ... আপনার পদ্ধতিটি পার্স বলা উচিত, যেহেতু ট্রাই পার্স কনভেনশন অনুসরণ করে একটি বুলিয়ান ফিরিয়ে দেওয়ার জন্য ট্রাই পার্স নামে একটি পদ্ধতি আশা করব। ;-)
মিস্টার

@ মিস্টার: ঠিক তেমনি উভয় ক্ষেত্রেই এটি সঠিক বিদ্যমান কনভেনশন অনুসরণ করে না - যাঁরা কেবল Parseপ্রত্যাশা করতেন এটি ফিরে আসবে DateTimeএবং ব্যর্থতার ব্যতিক্রম হয়, তাই না? তবে হ্যাঁ, আপনি যা খুশি করতে পারেন ... এবং নোডা টাইমে, Parseপরিবর্তে আমি প্রাসঙ্গিক পদ্ধতিগুলির নাম দিয়েছি ।
জন স্কিটি

1
elseশব্দ অপ্রয়োজনীয় (আপনার প্রথম উদাহরণে) যেহেতু শেষে দফা হয় ifব্লক পৌঁছে হতে পারে না।
জেপ্প স্টিগ নীলসেন

1
@ জেপ্পস্টিগনিয়েলসন: হ্যাঁ, এটি অপ্রয়োজনীয় - তবে এটি প্রতিসমের জন্য স্টাইলিস্টিকভাবে পছন্দনীয় হতে পারে। এটি কেবল একটি ব্যক্তিগত পছন্দ (এবং আমিও ধারাবাহিক নই, ...)
জন স্কিটি

3
@ কিকিনেট: অন্যটি ব্যবহার করা আরও পরিষ্কার করে দেয় যে এক বা অন্য পথ নেওয়া হবে এবং উভয়ই ফিরে আসবে। আমি ব্যাপকভাবে নেস্টেড কোডের বিপক্ষে, তবে এই ক্ষেত্রে এটি আসলেই কোনও সমস্যা নয় আইএমও।
জন স্কিটি

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;
}

আশাকরি এটা সাহায্য করবে :)

সম্পাদনা: (স্পষ্টত) ভুলভাবে পরীক্ষিত এক্সটেনশন পদ্ধতিটি সরানো হয়েছে, কারণ (কিছু খারাপ হুর দ্বারা প্রস্তাবিত হিসাবে) এক্সটেনশন পদ্ধতিগুলি "এই" প্যারামিটারটি পরিবর্তন করার চেষ্টা করে যা মান ধরণের সাথে কাজ করবে না।

পিএস দ্য খারাপ হুর একটি পুরানো বন্ধু :)


এই তারিখটি শুরু করতে চান না [আপনি যেমন এটি পরম হিসাবে ব্যবহার করছেন] ঠিক আছে, আমি পিক হওয়া বন্ধ করব!
রুবেন বারটেলিংক

আমার উপর সংকলক রাখবেন না, তবে ডেটটাইম যেমন একটি মান ধরণের, তাই কী এক্সটেনশন পদ্ধতি ডিফ সংকলন করে?
রুবেন বারটেলিংক

আপনি যদি এটি না তৈরি করেন তবে ফলাফল ফিরে আসবে না - [টেস্টফিজার্ট] পাবলিক ক্লাস যখন এক্সটেন্ডিং {[টেস্ট] পাবলিক অকার্যকর ট্রাইপার্স শোল্ডওয়ার্ক () {ডেটটাইম? x = নাল; var res = Externders.TryParse (x, "1/1/1990"); Assert.IsTrue (res)
রুবেন বারটেলিংক

; অ্যাসেট.ট্যাট (এক্স! = নাল); sert As অ্যাসেটে ব্যর্থ হয় hat অর্থাৎ ডেটটাইম একটি মান ধরণের হিসাবে ফলাফলটি পরিবর্তিত হয় না (যা ফোনের স্ক্রিনে সর্বদা একটি সুন্দর আগাছা প্রশ্ন: ডি)
রুবেন বারটেলিংক

(obv প্রথম (অ-এক্সটেনশান) একটি কাজ করবে, তবে এটি আউট হওয়া উচিত, রেফ নয়) এবং যদি আপনি সাধারণভাবে ট্রাইএক্সএক্সএক্সএক্স এপিআইয়ের সাথে ফিট করতে ব্যর্থ হন তবে ফলটি বাতিল করতে হবে - খুব নিশ্চিত এফডিজি উল্লেখ করেছে যে, মানুষ, আমি আমি বাছাই!
রুবেন বারটেলিংক

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, এর জন্য? এটি কখনও ব্যবহৃত হয় না।
মাইক Zboray

1
@ মিকেজ - এটি কীভাবে এক্সটেনশান পদ্ধতিগুলি কাজ করে, এটি কম্পাইলার দ্বারা এটি ব্যবহার করে যে এটি একটি এক্সটেনশন পদ্ধতি হওয়া উচিত।
এরিক ফানকেনবাশ

3
@ মিস্ত্রিমন আমি জানি একটি এক্সটেনশন পদ্ধতি কী। একটি এক্সটেনশন পদ্ধতির জন্য আরও উপযুক্ত স্বাক্ষর হবে DateTime? TryParse(this string dateString)। এই বাস্তবায়নটি কেবল উদ্ভট।
মাইক জোবোরে

3
@ মিকেজ - তাহলে আপনি কেন এটি জিজ্ঞাসা করলেন? আপনার কেবল ডেটটাইমের জন্য যখন স্ট্রিং নেমস্পেসের প্রয়োজন হয় তখন কেন এটি দূষিত করবেন? উদ্দেশ্য DateTime.TryParse একটি এনালগ তারিখসময় যে প্রদান করা হয় .TryParse?
এরিক Funkenbusch

1
@ এরিকফুনকেনবাশ এই এক্সটেনশন পদ্ধতিটি পছন্দ করতে বা কোনও কল সিনট্যাক্সের অনুমতি দেবে না । সুতরাং মাইক জেড সঠিক, এটি পদ্ধতির জন্য নির্বোধ স্বাক্ষর। (DateTime?).TryParse( ... )Nullable<DateTime>.TryParse( ... )
জেপ্প স্টিগ নীলসেন

1

মাইক্রোসফ্ট কেন এটি পরিচালনা করল না আমি তা দেখতে পাচ্ছি না। এটির সাথে মোকাবিলা করার জন্য একটি স্মার্ট সামান্য ইউটিলিটি পদ্ধতি (আমার ইন্টির সাথে সমস্যাটি ছিল, তবে ডেটটাইমের সাথে ইন্ট প্রতিস্থাপন করা একই প্রভাব হবে, হতে পারে .....

    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;

আপনি যদি এটিকে একটি যথাযথ ট্রাই পার্স সিউডো-এক্সটেনশন পদ্ধতি করতে চান তবে আপনি এটি করতে পারেন:

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;
    }
}

@ আরবনিক আমি যা বলেছিলাম তার থেকে আলাদা কীভাবে?
সিপিকোলেলা

1
আমার পূর্ববর্তী মন্তব্যটি উপেক্ষা করুন (আমি আপনার সমাধানটিকে সমর্থন করেছি!), সর্বশেষ সি # এর জন্য আমাকে নাল দেওয়া দরকার: ডেটটাইম? d = ডেটটাইম.ট্রি পার্স (ব্লা, ডেটটাইম dt আউট)? তারিখ: (তারিখটাইম?) নাল;
রবনিক

1

এখানে একটি একক লাইন সমাধান:

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

-3

বিকল্পভাবে, যদি আপনি উত্থাপিত সম্ভাব্য ব্যতিক্রম নিয়ে উদ্বিগ্ন না হন তবে আপনি পার্সের জন্য ট্রাইপার্স পরিবর্তন করতে পারেন:

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

যদিও কোনও বুলিয়ান সাফল্যের ইঙ্গিত দেয় না, তবে এমন কিছু পরিস্থিতিতে ব্যবহারিক হতে পারে যেখানে আপনি জানেন যে ইনপুট পাঠ্যটি সর্বদা বৈধ থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.