【问题标题】:Allow Nulls into a List<DateTime> but exclude nulls in Min.Date()允许空值进入 List<DateTime> 但在 Min.Date() 中排除空值
【发布时间】:2016-03-09 23:51:58
【问题描述】:

我正在尝试使用日期填充 List,但允许 Null,因为数据源可以包含日期的空值。这是我尝试过的代码:

List<Nullable<DateTime>> DateList = new List<Nullable<DateTime>>();


    for (int ii = 0; ii < queryresults.Count; ii++)
    {

        object o = queryresults[ii].Fields[SplitComboBox.SelectedItem.ToString()].Value;

        if (o is DateTime)
        {
            DateList.Add((DateTime)o);
        }
        else
        {
            DateList.Add(null);
        }
    }
}        

var firstDay = DateList.Min().Date;
var results =
    DateList
      .GroupBy(x => x.Date.Subtract(firstDay).Days / 7 + 1)
      .SelectMany(gx => gx, (gx, x) => new {Week = gx.Key,DateTime = x,Count = gx.Count(),});

但现在 .Min().Date 不起作用。

编辑

我的主要目标是能够从集合中的列中提取所有日期时间值。查找 Min().Date 并根据 Min().Date 从 Min().Date 开始按周分组日期时间

这基本上是我想出的,遍历集合,将所有日期时间放入日期列表中,找到最小值并将它们分组以找到星期。我需要空值作为占位符,因为我最终要做的是将每个值输出回集合,所以我知道日期时间在哪一周,与 min.date 相关

【问题讨论】:

  • 如果列表中没有日期,您希望发生什么? firstDay 应该是什么?
  • 叹气...伙计们,把 lamda in 放到Min() 调用...每个 LINQ 步骤都有与之相关的成本,不要只是假设它会自动解析为美丽的表达式树(这是一个矛盾的说法,顺便说一句 - 表达式树永远不会美丽)......
  • 好吧,@code4life。就此而言,if 块的代码比需要的要多得多。 DateList.Add(o as DateTime?); 就足够了。
  • @recursive 我从代码中省略了 firstday 的默认值。
  • 我基本上是在应用这个 groupby 并计数从我的数据源集合中获得的每一行,并将其作为附加列吐回。我不知道是否有更简单的方法来做到这一点。

标签: c# linq list datetime


【解决方案1】:

这应该可以解决问题:

var firstDay = DateList.Where(d => d != null).Cast<DateTime>().Min().Date;

过滤掉空值,将剩余的值转换为常规DateTime

编辑:你也可以在 groupby 之前做:

var filtered = DateList.Where(d => d != null).Cast<DateTime>().ToList();
var firstDay = filtered.Min().Date;
var results = filtered.GroupBy(x => x.Date.Subtract(firstDay).Days / 7 + 1)
                      ...

但我想知道为什么您首先需要列表中的空值?只需创建一个List&lt;DateTime&gt; 并添加不为空的值。

【讨论】:

  • 现在 GroupBy 行抛出此异常:行错误 CS1061 'DateTime?'不包含“日期”的定义,并且没有扩展方法“日期”接受“日期时间”类型的第一个参数?可以找到(您是否缺少 using 指令或汇编
  • 嗯,你的列表没有改变,你真的需要空值吗?在我看来,您应该在 GroupBy 之前将它们过滤掉
  • 嗯,我需要空值作为占位符,因为我最终会将它们吐回数据源。因此,如果我有 80 个值,其中 10 个是空值,我希望能够吐出 80 个值而不是 70。我刚刚尝试过,但出现了超出范围的异常。
  • 我正在做的是将组值应用于我的数据源集合中的每一行,然后将其作为列再次输出到 datagridview 中。
【解决方案2】:

通过查看HasValue 属性过滤集合/列表中的空值。

DateList.Where(d=>d.HasValue).Min();

工作Demo

【讨论】:

  • .Where(d =&gt; d.HasValue).Min().Date 仍然无法编译
  • 它不能抛出,因为它不会编译。
  • 应该可以编译,见附件演示。
  • 附上的demo有不同的代码。我现在明白你的意思了,但在这个答案的某处缺少.Value
  • 我为你修改了其余的代码,现在查看完整的演示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2011-07-14
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多