将三元条件运算符更改为常规 if else 语句
Change a ternary conditional operator to regular if else statement
我有一个检查事件开始和结束日期的逻辑。如果开始日期和结束日期在同一 月 内,则它仅显示一个日期,例如 2021 年 2 月 18 日。但如果它是一个多日活动,那么它会像这样显示活动日期,例如 2021 年 2 月 18 日 - 2021 年 3 月 24 日.
这个逻辑由三元条件处理并且工作正常,但现在我想添加第三个条件,用于事件是多天并且开始和结束日期在同一个月。对于第三个条件,我想省略开始日期中的月份名称,并且只在结束日期之后显示一次月份,如下所示:18 - 22 Feb, 2021 而不是 2 月 18 日- 2021 年 2 月 22 日。
这是我的三元条件,我正在考虑将其更改为标准的 if else 语句以获得更大的灵活性,但我不确定如何更改它以及第三个条件的逻辑是什么:
<%# (String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd"))) ? String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset"))) : String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset"))) %>
如果能帮助我理解这段代码的逻辑,我将不胜感激,它可以帮助我理解如何将其更改为 if else 语句。
所以,让我们开始添加一些空格以将其格式化为三进制:
(String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd")))
? String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")))
: String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")))
这很容易直接转化为 if/else:
string result;
if (String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd")))
{
result = String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")));
}
else
{
result = String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")));
}
然而,这对可读性并没有特别的帮助...让我们稍微改进一下。
首先声明一些变量以避免所有这些重复的转换:
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
double eventEndUtcOffsetMins = (double)Eval("EventEndUtcOffset");
string result;
if (String.Format("{0:dd MMM}", eventStart) == String.Format("{0:dd MMM}", eventEnd))
{
result = String.Format("{0:dd MMM, yyy}", eventEnd.AddMinutes(eventEndUtcOffsetMins));
}
else
{
double eventStartUtcOffsetMins = (double)Eval("EventStartUtcOffset");
result = String.Format("{0:dd MMM}", eventStart.AddMinutes(eventStartUtcOffsetMins))+" - "+String.Format("{0:dd MMM, yyy}",eventEnd.AddMinutes(eventEndUtcOffsetMins));
}
情况正在好转。我们可以通过对这些偏移量使用 TimeSpans
来缩短它:这将复杂性从那些已经很长的 String.Format
行转移到声明 eventStartUtcOffset
和 eventEndUtcOffset
的行中。
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
var eventEndUtcOffset = TimeSpan.FromMinutes((double)Eval("EventEndUtcOffset"));
string result;
if (String.Format("{0:dd MMM}", eventStart) == String.Format("{0:dd MMM}", eventEnd))
{
result = String.Format("{0:dd MMM, yyy}", eventEnd + eventEndUtcOffset);
}
else
{
var eventStartUtcOffset = TimeSpan.FromMinutes((double)Eval("EventStartUtcOffset"));
result = String.Format("{0:dd MMM}", eventStart + eventStartUtcOffset)+" - "+String.Format("{0:dd MMM, yyy}",eventEnd + eventEndUtcOffset);
}
我们还可以删除对 String.Format
的调用,并改用内插字符串:
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
var eventEndUtcOffset = TimeSpan.FromMinutes((double)Eval("EventEndUtcOffset"));
string result;
if ($"{eventStart:dd MMM}" == $"{eventEnd:dd MMM}")
{
result = $"{eventEnd + eventEndUtcOffset:dd MMM, yyy}";
}
else
{
var eventStartUtcOffset = TimeSpan.FromMinutes((double)Eval("EventStartUtcOffset"));
result = $"{eventStart + eventStartUtfOffset:dd MMM} - {eventEnd + eventEndUtfOffset:dd MMM, yyy}";
}
好多了 -- 至少我们现在可以看到代码在做什么。
试试这个代码-
var startDate = new DateTime(2020, 12, 12);
var endDate = new DateTime(2020, 02, 18);
var resDate=GetDateBreak(startDate, endDate);
Console.WriteLine(resDate);
public static string GetDateBreak(DateTime sDate, DateTime eDate)
{
CultureInfo info = new CultureInfo("en-us");
return (sDate.Month == eDate.Month) ? $"Date={sDate.Day}-{eDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(eDate.Month)},{eDate.Year}"
: $"Date={sDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(sDate.Month)}-{eDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(eDate.Month)},{eDate.Year}";
}
我有一个检查事件开始和结束日期的逻辑。如果开始日期和结束日期在同一 月 内,则它仅显示一个日期,例如 2021 年 2 月 18 日。但如果它是一个多日活动,那么它会像这样显示活动日期,例如 2021 年 2 月 18 日 - 2021 年 3 月 24 日.
这个逻辑由三元条件处理并且工作正常,但现在我想添加第三个条件,用于事件是多天并且开始和结束日期在同一个月。对于第三个条件,我想省略开始日期中的月份名称,并且只在结束日期之后显示一次月份,如下所示:18 - 22 Feb, 2021 而不是 2 月 18 日- 2021 年 2 月 22 日。
这是我的三元条件,我正在考虑将其更改为标准的 if else 语句以获得更大的灵活性,但我不确定如何更改它以及第三个条件的逻辑是什么:
<%# (String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd"))) ? String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset"))) : String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset"))) %>
如果能帮助我理解这段代码的逻辑,我将不胜感激,它可以帮助我理解如何将其更改为 if else 语句。
所以,让我们开始添加一些空格以将其格式化为三进制:
(String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd")))
? String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")))
: String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")))
这很容易直接转化为 if/else:
string result;
if (String.Format("{0:dd MMM}", (DateTime)Eval("EventStart")) == String.Format("{0:dd MMM}", (DateTime)Eval("EventEnd")))
{
result = String.Format("{0:dd MMM, yyy}", ((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")));
}
else
{
result = String.Format("{0:dd MMM}", ((DateTime)Eval("EventStart")).AddMinutes((double)Eval("EventStartUtcOffset")))+" - "+String.Format("{0:dd MMM, yyy}",((DateTime)Eval("EventEnd")).AddMinutes((double)Eval("EventEndUtcOffset")));
}
然而,这对可读性并没有特别的帮助...让我们稍微改进一下。 首先声明一些变量以避免所有这些重复的转换:
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
double eventEndUtcOffsetMins = (double)Eval("EventEndUtcOffset");
string result;
if (String.Format("{0:dd MMM}", eventStart) == String.Format("{0:dd MMM}", eventEnd))
{
result = String.Format("{0:dd MMM, yyy}", eventEnd.AddMinutes(eventEndUtcOffsetMins));
}
else
{
double eventStartUtcOffsetMins = (double)Eval("EventStartUtcOffset");
result = String.Format("{0:dd MMM}", eventStart.AddMinutes(eventStartUtcOffsetMins))+" - "+String.Format("{0:dd MMM, yyy}",eventEnd.AddMinutes(eventEndUtcOffsetMins));
}
情况正在好转。我们可以通过对这些偏移量使用 TimeSpans
来缩短它:这将复杂性从那些已经很长的 String.Format
行转移到声明 eventStartUtcOffset
和 eventEndUtcOffset
的行中。
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
var eventEndUtcOffset = TimeSpan.FromMinutes((double)Eval("EventEndUtcOffset"));
string result;
if (String.Format("{0:dd MMM}", eventStart) == String.Format("{0:dd MMM}", eventEnd))
{
result = String.Format("{0:dd MMM, yyy}", eventEnd + eventEndUtcOffset);
}
else
{
var eventStartUtcOffset = TimeSpan.FromMinutes((double)Eval("EventStartUtcOffset"));
result = String.Format("{0:dd MMM}", eventStart + eventStartUtcOffset)+" - "+String.Format("{0:dd MMM, yyy}",eventEnd + eventEndUtcOffset);
}
我们还可以删除对 String.Format
的调用,并改用内插字符串:
var eventStart = (DateTime)Eval("EventStart");
var eventEnd = (DateTime)Eval("EventEnd");
var eventEndUtcOffset = TimeSpan.FromMinutes((double)Eval("EventEndUtcOffset"));
string result;
if ($"{eventStart:dd MMM}" == $"{eventEnd:dd MMM}")
{
result = $"{eventEnd + eventEndUtcOffset:dd MMM, yyy}";
}
else
{
var eventStartUtcOffset = TimeSpan.FromMinutes((double)Eval("EventStartUtcOffset"));
result = $"{eventStart + eventStartUtfOffset:dd MMM} - {eventEnd + eventEndUtfOffset:dd MMM, yyy}";
}
好多了 -- 至少我们现在可以看到代码在做什么。
试试这个代码-
var startDate = new DateTime(2020, 12, 12);
var endDate = new DateTime(2020, 02, 18);
var resDate=GetDateBreak(startDate, endDate);
Console.WriteLine(resDate);
public static string GetDateBreak(DateTime sDate, DateTime eDate)
{
CultureInfo info = new CultureInfo("en-us");
return (sDate.Month == eDate.Month) ? $"Date={sDate.Day}-{eDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(eDate.Month)},{eDate.Year}"
: $"Date={sDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(sDate.Month)}-{eDate.Day} {info.DateTimeFormat.GetAbbreviatedMonthName(eDate.Month)},{eDate.Year}";
}