Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缩短c#null与tostring的合并(如果不是null)_C#_Refactoring - Fatal编程技术网

缩短c#null与tostring的合并(如果不是null)

缩短c#null与tostring的合并(如果不是null),c#,refactoring,C#,Refactoring,我正在尝试从aspx页面中的数据库调用输出数据 我正在检查中继器正在处理的数据表在当前行的StartDate列中是否有DateTime,并以良好的格式输出日期。如果该行不包含DateTime,那么它将是一个DBNull.Value,我希望字符串只说“从不” 下面的代码可以工作,但是非常长,并且调用了DataTable两次(虽然它在内存中,所以第二次调用可能对执行速度没有多大影响,但它会使aspx页面变得混乱,使代码更难阅读) 然而,我想做的是沿着以下非工作代码的思路做一些事情,因为它删除了对

我正在尝试从aspx页面中的数据库调用输出数据

我正在检查中继器正在处理的数据表在当前行的StartDate列中是否有DateTime,并以良好的格式输出日期。如果该行不包含DateTime,那么它将是一个DBNull.Value,我希望字符串只说“从不”

下面的代码可以工作,但是非常长,并且调用了DataTable两次(虽然它在内存中,所以第二次调用可能对执行速度没有多大影响,但它会使aspx页面变得混乱,使代码更难阅读)


然而,我想做的是沿着以下非工作代码的思路做一些事情,因为它删除了对DataTable单元格的第二个引用:

<%# (((DataRow)Container.DataItem)["StartDate"] as DateTime).ToString("yyyy-MM-dd h:mm t") ?? "never" %>

不幸的是,null合并运算符需要在ToString之前运行,因为null上的ToString是一个错误,但是null合并运算符需要在ToString之后运行,以便返回字符串,而不是日期时间


有没有速记方法?这似乎是一种非常常见的事情。

我已经为这些事情编写了扩展,以后再也不用担心了

公共字符串GetStringOrDefault(此数据行为r,字符串为col,字符串为def=”“)
{
if(DBNull.Value.Equals(r[col]))
返回def;
返回r[col].ToString();
}
公共字符串GetDateStringOrDefault(此数据行r,字符串列,字符串格式,字符串定义=)
{
if(DBNull.Value.Equals(r[col]))
返回def;
返回((日期时间)r[col])到字符串(格式);
}
用法



似乎您想要
??“从不”
,基本上是null条件运算符
?。
只会在左侧不为null时进行右侧调用,如果右侧为null,则只会导致null。但是,如果这样做,当
为null
时,将得到“.M.”,并且不会合并。将其包含在格式字符串中并引用,即
?.ToString(“yyyy-MM-dd h:MM t'.M.”)??“从不”
所以你实际上得到了
null
并且你有机会让它合并。当我尝试这个时,我得到了“无效的表达式项”。”。我做错了什么?我原以为您可以使用
((DataRow)Container.DataItem)[“StartDate”是DateTime日期)?date.ToString(“yyyy-MM-dd h:MM-t”)+“.M.”:“从不”
——也就是说,使用模式匹配的答案确实是最好的方法。。。也就是说,
?。
受WebForms解析器的支持(只是在数据绑定上下文中尝试过),所以确实存在语法错误。你还没有分享你尝试过的最新(确切的)东西,因此没有办法知道是什么问题。(不过,如果您与他人分享,请编辑问题,不要将其放在评论中。)
<%# (((DataRow)Container.DataItem)["StartDate"] as DateTime).ToString("yyyy-MM-dd h:mm t") ?? "never" %>
<%# ((DataRow)Container.DataItem)).GetDateStringOrDefault("StartDate", "yyyy-MM-dd h:mm t", "never") %>