使用LINQ确定序列不包含任何元素

时间:2012-08-09 13:08:28

标签: c# .net linq

  

可能重复:
  LINQ: Max or Default?

我有一些LINQ来过滤DateTime vars。

List<DateTime> lst1 = new List<DateTime>();

 //.... add DataTime here

var d = lst1.Where(q => q <= DateTime.Now).Max();

如果我没有匹配项,则会发生异常。

我需要空d或至少null,我根本不需要例外。

我该如何解决?

谢谢!

3 个答案:

答案 0 :(得分:71)

尝试

var d = lst1.Where(q => q <= DateTime.Now).DefaultIfEmpty().Max();

如果没有匹配项,您的结果现在将包含DateTime.MinValue

答案 1 :(得分:5)

如果源没有任何元素,则Max()会抛出ArgumentNullException。您可以编写一个扩展方法来检查这个并返回null(或任何你想要的)如果没有任何元素。

public static Nullable<DateTime> MaxOrNull(this IEnumerable<DateTime> source)
{
    if (source.Count() == 0)
        return null;
    else
        return source.Max();
}

答案 2 :(得分:1)

我喜欢:

var d = lst1.Where(q => q <= DateTime.Now).OrderByDescending(q => q.DateField).FirstOrDefault();

如果列表为空,这将返回null。