代码之家  ›  专栏  ›  技术社区  ›  the_tr00per

C#仅在不为空时分配日期时间值

  •  -2
  • the_tr00per  · 技术社区  · 6 年前

    我们有一个自定义对象,我正试图从数据集中分配和填充它。除非datetime字段中有空值,否则它可以正常工作。

    以下是对象示例:

    public class Test
    {
    
        public DateTime Date1{ get; set; }
        public DateTime Date2{ get; set; }
     }
    

    我们想知道,如果值为空,如何通过解析指定任何值来达到最佳效果:

    var convertedList = (from rw in ds.Tables[0].AsEnumerable()
        select new Test()
           {
              Date1 = Convert.ToDateTime(rw?["StartDate"]),
              Date2 = Convert.ToDateTime(rw?["EndDate"])
            }).ToList();
    

    当为null时,下面将抛出一个异常(应该是这样)。只是想知道处理这个问题的最佳实践?注意我们不能使用可为空的datetime(datetime?)由于外部应用程序。

    理想的情况下,如果datetime为空,我们就不想分配datetime

    4 回复  |  直到 6 年前
        1
  •  0
  •   Ashkan Mobayen Khiabani    6 年前

    您可能需要指定一些默认值,例如:

    Date1 = rw?["StartDate"]==null?DateTime.MinValue:Convert.ToDateTime(rw?["StartDate"]);
    

    或者忽略那些空值:

    var convertedList = (from rw in dt2.AsEnumerable() where rw["StartDate"] != null && rw["EnDate"] != null
        select new Test()
        {
            Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
            Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
        }).ToList();
    
        2
  •  0
  •   VDWWD    6 年前

    您可以检查NULL并替换为所需的日期。

    var convertedList = (from rw in dt2.AsEnumerable()
        select new Test()
        {
            Date1 = (rw["StartDate"] == null ? Convert.ToDateTime(rw["StartDate"]) : new DateTime()),
            Date2 = (rw["EndDate"] == null ? Convert.ToDateTime(rw["EndDate"]) : new DateTime())
        }).ToList();
    
        3
  •  -1
  •   Callam Woolgar    6 年前

    你不能用吗日期时间.TryParse它将尝试将字符串转换为日期时间,但如果无法转换,则将使用dateTime.minValue?

        4
  •  -1
  •   Christopher    6 年前

    你要检查输入值的正确性吗?如果是这样的话,我称之为“被动错误报告”的方法可能是正确的。

    INotifyDataErrorInfo

    您经常在WPF中使用它,其中ViewModel可能需要接受可为Null的值,甚至是数字的字符串(完全是因为视图的原因),但是模型除了解析的整数外,不能接受空值或其他任何东西。