【问题标题】:How to handle "Nullable value type may be null" (for TimeSpan) inside the sum() methode?如何在 sum() 方法中处理“可空值类型可能为空”(对于 TimeSpan)?
【发布时间】:2021-10-26 01:43:35
【问题描述】:

在我的 Asp.net 核心项目中,我需要检查 null TimeSpan 属性。 这是我的方法:

 return result.Include(e => e.Episodes).AsEnumerable().Select(c => new ShowListCoursesViewModel()
            {
                CourseId = c.CourseId,
                CourseImageName = c.CourseImageName,
                CoursePrice = Convert.ToDecimal(c.CoursePrice),
                CourseTitle = c.CopurseTitle,
                CourseTotalTime = new TimeSpan(c.Episodes.Sum(t => t.EpisodeTimeLength.Value.Ticks) )
            }).Skip(skip).Take(take).OrderByDescending(d => d.CoursePrice).ToList();

它在t.EpisodeTimeLength 下方显示一个绿色波浪线,并表示:

可空值类型可能为空。

我的 CourseTotalTime 属性可以为空,EpisodeTimeLength 也可以为空。

如何在Sum 中将EpisodeTimeLengthnull 值解释为00:00:00?示例:[null, 01:00:00, 01:00:00] 应该在 CourseTotaltime 中产生 02:00:00

【问题讨论】:

  • 因此,如果 any EpisodeTimeLengthnull,即使 EpisodeTimeLength 的其他值属于同一课程,您也希望将 null 分配给 CourseTotalTime有非空值?对吗?
  • 不,我只想得到我的EpisodeTimeLength 的总和,然后如果我的EpisodeTimeLengths 之一为空,则将其视为“00:00:00”。
  • 所以如果EpisodeTimeLengthnull,你希望CourseTotalTime 是00:00:00?
  • 那么您不想将 00:00:00 分配给CourseTotalTime,正如您在问题中所述。我建议你编辑你的问题来解决这个问题。
  • 我希望 Sum() 将 null 视为 00:00:00。就是这样

标签: c# asp.net-core-mvc nullable timespan nullable-reference-types


【解决方案1】:

您可以在Sum 之前使用Where 排除null 值:

CourseTotalTime = new TimeSpan(
    c.Episodes
        .Where(t => t.EpisodeTimeLength.HasValue)
        .Sum(t => t.EpisodeTimeLength.Value.Ticks))

或者,您可以指定在t.EpisodeTimeLengthnull 时使用的默认值:

CourseTotalTime = new TimeSpan(
    c.Episodes
        .Sum(t => (t.EpisodeTimeLength ?? TimeSpan.Zero).Ticks))

这利用了null-coalescing operator

Demonstration of both approaches

【讨论】:

  • 是的。这就是我一直在寻找的东西。但在这种情况下,';'句子末尾的符号应省略:)。非常感谢。
  • 抱歉,这是我自己测试的遗留问题 :) 我现在删除了分号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2013-02-16
  • 2019-12-17
相关资源
最近更新 更多