c# - 将三元条件运算符更改为常规 if else 语句
问题描述
我有一个检查事件的开始和结束日期的逻辑。如果开始日期和结束日期在同一月份,则仅显示一个日期,例如18 Feb, 2021。但如果是多日活动,则它会显示这样的活动日期,例如18 Feb - 24 Mar, 2021。
此逻辑由三元条件处理并且工作正常,但现在我想添加第三个条件,用于事件为多天且开始和结束日期在同一个月内。对于这第三个条件,我想省略开始日期中的月份名称,只在结束日期之后显示一次月份,如下所示:2021 年2 月 18 日至 22 日,而不是 2021 年 2 月 18 日至 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
的行转移到 delateeventStartUtcOffset
和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}";
}
这有点好——至少我们现在可以看到代码在做什么。
推荐阅读
- django - 如何在 Django 管理中仅显示与当前用户公司对应的数据
- wordpress - 改变 Woocommerce 迷你购物车的行为
- r - 有什么好的方法可以一一运行 Rstudio 作业吗?
- javascript - 具有 HTML/JQuery 可见性的 Javascript 循环
- r - dplyr tibble() 输出在 R 中被截断,我如何显示完整的输出?
- c# - 复制所有文件夹,除了 C# 中的某些文件夹和文件
- javascript - 没有 React 但有 webpack 的 Deck.gl 不会呈现指定的容器
- batch-file - 问两个问题时,有没有更好的方法来执行这个选择命令序列?
- assembly - Nasm - 在取消引用时在地址上使用乘法
- jquery - 如何从 Razor Pages 渲染屏幕对 MVC 控制器进行异步调用