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

Dev*_*per 30 .net c# linq

可能重复:
LINQ:Max还是Default?

我有一些LINQ来过滤DateTime变量.

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

 //.... add DataTime here

var d = lst1.Where(q => q <= DateTime.Now).Max();
Run Code Online (Sandbox Code Playgroud)

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

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

我该如何解决?

谢谢!

pod*_*ska 74

尝试

var d = lst1.Where(q => q <= DateTime.Now).DefaultIfEmpty().Max();
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果您希望不使用lst1的属性的最大值,则需要考虑null。例如:`var maxHeight = lst1.Where(q =&gt; q &lt;= DateTime.Now).DefaultIfEmpty()。Max(q =&gt; q?.height ?? 0);` (2认同)

小智 5

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

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

  • 我会使用`if(source.Any()== false)`而不是`if(source.Count()== 0)`.您无需计算以检查列表是否为空. (5认同)