【问题标题】:Write "?" in a string if a property is null写 ”?”如果属性为空,则在字符串中
【发布时间】:2015-10-16 09:32:34
【问题描述】:

如何将 Startedate 写成“?”是开始日期为空

public DateTime? StartDate { get; set; }

public override string ToString()
{
    return String.Format("Course {0} ({1} is an {2} course, will be given by {3}, starts on {4}, costs {5:0.00} and will have maximum {6} participants"
        , Name
        , CourseId
        , CourseType
        , Teacher
        , (StartDate == null ? "?" : StartDate)
        , Price
        , MaximumParticipants);
}

【问题讨论】:

  • 改成(StartDate == null ? "?" : StartDate.ToString())
  • 三元语句要求两个操作数的类型相同。

标签: c# datetime string-formatting tostring


【解决方案1】:

C# 6 允许您在没有三元运算符的情况下编写此代码,如下所示:

StartDate?.ToString("dd-MM-yyyy") ?? "?"    

?. 只有在StartDate 不是null 时才会有条件地执行ToString。空合并运算符?? 将通过提供"?" 字符串作为null 值的替换来完成这项工作。

您可以更进一步,将String.Format 替换为插值字符串,如下所示:

return $"Course {Name} ({CourseId} is an {CourseType} course, will be given by {Teacher}, starts on {StartDate?.ToString("dd-MM-yyyy") ?? "?"}, costs {Price:0.00} and will have maximum {MaximumParticipants} participants";

【讨论】:

    【解决方案2】:

    ternery operator 的两边必须是相同的类型。来自文档:

    first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

    所以您可以简单地将日期转换为字符串(注意格式由您决定):

    (StartDate == null ? "?" : StartDate.Value.ToString("dd-MM-yyyy"))
    

    【讨论】:

    • 啊,我明白了,因为 StartDate 是 DateTime 和“?”是一个字符串
    • StartDate.ToString("dd-MM-yyyy") 将不起作用。我需要:StartDate.Value.ToString("dd-MM-yyyy")。但是为什么需要额外的格式呢?
    • @MartinMulder 实际上它会起作用。我放在那里的格式作为示例,由 OP 选择如何显示它。
    • 因为您的返回类型是字符串,并且您正在构建一个在您的返回语句中,所以三元运算符的真假值也应该都是字符串
    • @KoenVanLooveren 是的。我将进行编辑以添加说明。
    【解决方案3】:

    您可以调整现有代码

    (StartDate == null ? "?" : StartDate.ToString())
    

    或利用Nullable<T>.HasValue

    (StartDate.HasValue ? StartDate.ToString() : "?")
    

    重点是,?: 要求两个条件使用相同的类型。

    【讨论】:

      【解决方案4】:

      您可以使用 IsNullOrEmpty() 函数,它将覆盖 null 或空日期 (IsNullOrEmpty(StartDate) ? "?" : StartDate.ToString("dd-MM-yyyy"))

      【讨论】:

        猜你喜欢
        • 2017-08-08
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        相关资源
        最近更新 更多