Nano Hash - криптовалюты, майнинг, программирование

Как мне использовать DateTime.TryParse с Nullable ‹DateTime›?

Я хочу использовать метод DateTime.TryParse, чтобы получить значение datetime строки в Nullable. Но когда я пробую это:

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

компилятор говорит мне

аргумент out не классифицируется как переменная

Не уверен, что мне здесь нужно делать. Я также пробовал:

out (DateTime)d.Value 

и это тоже не работает. Любые идеи?

10.10.2008

Ответы:


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

(Могут быть более элегантные решения, но почему бы вам просто не сделать что-то, как указано выше?)

10.10.2008
  • Вы правы, я искал больше однострочного, чтобы сделать это, но я полагаю, что это сойдет. Не люблю создавать эту временную переменную, кажется беспорядочным. : - / Похоже, этот сценарий лучше поддерживать. 10.10.2008
  • см. предложение Binary Worrier псевдо-встроить это в метод расширения. 10.10.2008
  • Почему вы приводите DateTime к DateTime? Вам не нужно повторно использовать d2 перед его передачей в TryParse. 01.11.2008
  • @Slace - Я обновил ответ, чтобы включить ваше предложение. 31.05.2010
  • @Jason Kealey Я надеюсь, что это уже введено в VS2012, иначе мне придется продолжать использовать этот хороший фрагмент кода. 13.11.2012

  • 2

    Как говорит Джейсон, вы можете создать переменную правильного типа и передать ее. Возможно, вы захотите инкапсулировать его в своем собственном методе:

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

    Or in C# 7:

    public static DateTime? TryParse(string text) =>
        DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
    
    10.10.2008
  • Я, вероятно, не должен спорить с The Skeet, но ... вам следует вызвать свой метод Parse, поскольку я ожидаю, что метод с именем TryParse будет следовать соглашению TryParse и возвращать логическое значение. ;-) 13.04.2015
  • @Myster: Ну, в любом случае он не соответствует точному существующему соглашению - те, кто привык просто Parse, ожидали бы, что он вернет DateTime и выдаст исключение в случае неудачи, верно? Но да, вы можете делать все, что хотите ... и в Noda Time я вместо этого назвал соответствующие методы Parse. 13.04.2015
  • Ключевое слово else не нужно (в вашем первом примере), поскольку конечная точка блока if никогда не может быть достигнута. 24.01.2017
  • @JeppeStigNielsen: Да, в этом нет необходимости, но это может быть стилистически предпочтительнее для симметрии. Это просто личное предпочтение (и я тоже не согласен ...) 24.01.2017
  • Избегайте анти-шаблона стрелки else { return null; } от return null; View: blog.codinghorror.com/flattening-arrow-code 10.06.2017
  • @Kiquenet: использование else делает более ясным, что будет выбран тот или иной путь, и оба вернутся. Я против массового вложенного кода, но в данном случае это не проблема, ИМО. 10.06.2017

  • 3

    Вот немного сжатое издание того, что предложил Джейсон:

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

    4

    Вы не можете, потому что 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;
    }
    

    Надеюсь это поможет :)

    РЕДАКТИРОВАТЬ: Удален (очевидно) неправильно протестированный метод расширения, потому что (как указано в некоторых плохих словах) методы расширения, которые пытаются изменить параметр «this», не будут работать с типами значений.

    P.S. Речь идет о Bad Hoor - старый друг :)

    10.10.2008
  • Я не хочу инициировать дату [поскольку вы используете это как выходной параметр] Хорошо, я перестану быть придирчивым! 16.01.2009
  • У меня нет компилятора, но поскольку DateTime является типом значения, компилируется ли метод расширения def? 16.01.2009
  • Результат не вернется, пока вы его не добьетесь - [TestFixture] открытый класс WhenExnding {[Test] public void TryParseShouldWork () {DateTime? х = ноль; var res = Externders.TryParse (x, 01.01.1990); Assert.IsTrue (res) 16.01.2009
  • ; Assert.That (x! = Ноль); }} не работает с Assert.That, т.е. результат не изменяется, поскольку DateTime является типом значения (что всегда является хорошим вопросом для исключения на экранах телефонов: D) 16.01.2009
  • (obv, первый (нерасширенный) будет работать, но он должен быть отключен, а не ref - и вы должны обнулить результат, если он не соответствует API TryXXX в целом - почти уверен, что FDG упоминает об этом. Человек, я Я придирчива! 16.01.2009
  • Очевидно, что показанные образцы предназначены для иллюстрации. . . (И Рубен ПРЕКРАТИТЕ ВЫБИРАТЬ ВАМ ПЛОХО!) 16.01.2009
  • P.S. . . . и что это за тесты и утверждения, о которых вы говорите? (Расскажи мне о своем домашнем мире Усул) 16.01.2009
  • Рубен: Вы правы, товарищ, метод расширения не подойдет для этого (или любого другого типа значения). Хорошо подмечено . . . кашель я плохой кашель 16.01.2009

  • 5

    А как насчет создания метода расширения?

    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;
    
        }
    }
    
    24.06.2012
  • Для чего нужен этот первый параметр dateTime? Никогда не используется. 21.10.2012
  • @mikez - так работают методы расширения, он используется компилятором, чтобы знать, что это должен быть метод расширения. 11.02.2013
  • @MystereMan Я знаю, что такое метод расширения. Более подходящей сигнатурой для метода расширения будет DateTime? TryParse(this string dateString). Это просто причудливая реализация. 12.02.2013
  • @mikez - тогда почему ты спросил, для чего это было? Зачем загрязнять пространство имен строк, если оно нужно только для datetime? Цель состоит в том, чтобы предоставить аналог DateTime.TryParse, то есть DateTime? .TryParse 12.02.2013
  • @ErikFunkenbusch Этот метод расширения не разрешает синтаксис вызова, такой как (DateTime?).TryParse( ... ) или Nullable<DateTime>.TryParse( ... ). Итак, Майк z прав, это глупая подпись для метода. 24.01.2017
  • @JeppeStigNielsen - Вы, очевидно, не понимаете, как работают методы расширения. Вы не называете их статическими методами. Вы вызываете их как обычные методы, например variablename.TryParse(), а не typename.TryParse() 29.01.2017
  • @ErikFunkenbusch Да, вы правы. Здесь обсуждается вопрос о том, как использовать this DateTime? dateTime , когда этот параметр не используется в теле метода? Это оригинальный вопрос Майка З. Если бы кто-то использовал метод этого ответа, он должен был бы сделать это: DateTime? dummy = null; DateTime? result; var isSuccess = dummy.TryParse("some date text", out result);. В противном случае следует сначала присвоить значение переменной out, а также использовать переменную out result в качестве специального аргумента this, что кажется странным. Так можем ли мы лучше ответить на первый комментарий Майка З.? 29.01.2017

  • 6

    Вот однострочное решение:

    DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;
    
    18.02.2020
  • итак ... ты только что скопировал мой ответ 4 месяца спустя? 15.04.2021

  • 7

    Я не понимаю, почему Microsoft не справилась с этим. Небольшой умный служебный метод, чтобы справиться с этим (у меня была проблема с int, но замена int на DateTime будет тем же эффектом, может быть ...

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

    8

    Это тот лайнер, который вы ищете:

    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;
        }
    }
    
    18.10.2019
  • @robnick Чем это отличается от того, что я сказал? 13.12.2019
  • Не обращайте внимания на мой предыдущий комментарий (я поддержал ваше решение!), Для последней версии C # мне нужно было указать null: DateTime? d = DateTime.TryParse (мля, нет DateTime dt)? dt: (DateTime?) null; 14.12.2019

  • 9

    В качестве альтернативы, если вас не беспокоит возможное возникшее исключение, вы можете изменить TryParse на Parse:

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

    Хотя логического значения, указывающего на успех, тоже не будет, это может быть практично в некоторых ситуациях, когда вы знаете, что вводимый текст всегда будет действительным.

    07.08.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..