Сравни год и месяц лучше всего - PullRequest
2 голосов
/ 17 апреля 2020

Я написал эту логику c, чтобы сравнить исходный год / месяц с ответным годом / месяцем. но я хочу написать это лучше. если исходный год / месяц больше или равен ответному году / месяцу, тогда пройти. любое предложение??

if (source?.Year == response?.Year)
{
    return source?.Month >= response?.Month
        ? Outcome.Pass()
        : Outcome.Fail();
}
else if (source?.Year < response?.Year)
{
    return Outcome.Fail();
}
else if (source?.Year > response?.Year)
{
    return Outcome.Pass();
}
else
{
    return Outcome.Fail();
}

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Вам просто нужно сравнить source с началом response месяца.

var responseMonthBegin = response.HasValue 
    ? new DateTime(response.Value.Year, response.Value.Month, 1)
    : (DateTime?)null;

return source >= responseMonthBegin ? Outcome.Pass() : OutCome.Fail();
3 голосов
/ 17 апреля 2020

Просто обрежьте каждое до начала месяца:

private static DateTime TruncateToMonth(DateTime date) =>
    new DateTime(date.Year, date.Month, 1, 0, 0, 0);

Тогда вы можете использовать:

// TODO: Null handling
return TruncateToMonth(source) >= TruncateToMonth(response)
    ? Outcome.Pass()
    : Outcome.Fail();

Обратите внимание на TODO - я не пытался обрабатывать нулевые значения совсем. Я никогда не могу вспомнить правила достаточно четко, чтобы предсказать, что будет делать ваш текущий код. Если я не могу понять это, не концентрируясь, шансы на то же самое будут относиться к любому другому, кто пытается прочитать код тоже :) Так что я бы сделал действительно ясным, как вы хотите обрабатывать нули, например,

return source == null || response == null ? Outcome.Fail()
    : TruncateToMonth(source.Value) >= TruncateToMonth(response.Value) ? Outcome.Pass()
    : Outcome.Fail();

Как отмечается в комментариях, вам не нужно усекать исходное значение - я просто нахожу более понятным, если вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...