C# 使用LINQ确定序列不包含元素

C# 使用LINQ确定序列不包含元素,c#,.net,linq,C#,.net,Linq,可能重复: 我有一些LINQ要过滤DateTimevars List<DateTime> lst1 = new List<DateTime>(); //.... add DataTime here var d = lst1.Where(q => q <= DateTime.Now).Max(); List lst1=新列表(); //.... 在此处添加数据时间 var d=lst1。其中(q=>qTry var d=lst1。其中(q=>qMax(

可能重复:

我有一些LINQ要过滤
DateTime
vars

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

 //.... add DataTime here

var d = lst1.Where(q => q <= DateTime.Now).Max();
List lst1=新列表();
//.... 在此处添加数据时间
var d=lst1。其中(q=>qTry

var d=lst1。其中(q=>qMax()在源代码没有任何元素时抛出ArgumentNullException。您可以编写一个扩展方法来检查这一点,如果没有任何元素,则返回null(或任何您想要的值)

public static Nullable<DateTime> MaxOrNull(this IEnumerable<DateTime> source)
{
    if (source.Count() == 0)
        return null;
    else
        return source.Max();
}
publicstaticnullablemaxornull(此IEnumerable源代码)
{
if(source.Count()==0)
返回null;
其他的
返回source.Max();
}
我喜欢:

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

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

在变量d=…之前检查if(lst1.Where(q=>qvard=lst1.Any()?lst1.Where(q=>q显示如下解决方案:var d=lst1.Where(q=>ad==null?DateTime.Min:d)podiluska,您可能想向OP解释为什么您的解决方案现在显示lst1的日期值您的解决方案是完美的,但我不确定他是否会理解为什么。请注意,如果您希望从lst1中删除属性的最大值,则需要考虑null。例如:
var maxHeight=lst1。其中(q=>q?.height??0)
如果有人为UWP应用程序执行此操作,那么如果您试图在启用.NET本机工具链的发布模式下构建应用程序,您将遇到一个关于“多重继承”的非常奇怪的错误。这是由于使用了“DefaultIfEmpty()”,因此,我建议只编写一个自定义扩展方法,检查从Where返回的内容是否为null或空,如果是,则返回您想要的内容,否则继续使用您想要使用的agg函数(.Max,.Average)等。我将使用
if(source.Any()==false)
而不是
if(source.Count()==0)
。检查列表是否为空不需要计数。这样会更有效,因为在找到第一个元素时它将返回true。返回source.Any()?source.Max():null;设N为lst1的长度,则Max需要精确的N比较,OrderBy需要Nlog(N)最好的情况是最好的实现,最坏的情况是NN/2。当然,N是否小并不重要,但N~1000会产生很大的差异。
var d = lst1.Where(q => q <= DateTime.Now).OrderByDescending(q => q.DateField).FirstOrDefault();