繁体   English   中英

Lamda表达VS FirstOrDefault

[英]Lamda expression Where VS FirstOrDefault

我是新的使用lamda expressions ,我试图找出一些东西。 我创建了以下代码部分,代码返回日志文件的文件路径。

public static string GetLogFile()
{
    var fileTarget = LogManager.Configuration.AllTargets.Where(t=>t.Name == "LogName") as FileTarget;            
    return fileTarget == null ? string.Empty : fileTarget.FileName.Render(new LogEventInfo { Level = LogLevel.Info });
}

我的问题是当我使用时fileTarget是空的:

LogManager.Configuration.AllTargets.Where(t=>t.Name == "LogName")

但如果我改变那行代码为

LogManager.Configuration.AllTargets.FirstOrDefault(t=>t.Name == "LogName")

返回我的日志文件的正确路径。 任何人都可以向我解释WhereFirstOrDefault之间是否存在重大差异?

在您的情况下, Where返回对象FileTargetIEnumerable (只是一个列表)。 然后,将此列表转换为FileTarget 这就是为什么它是空的。

但是FirstOrDefault返回一个对象或null并且可以转换为您的类FileTarget 这就是它的原因。

实际上返回IEnumerable的地方(intellisense会告诉你这个)。 它不知道您的谓词可能匹配多少项。 FirstOrDefault将获得第一个项目,或者与您的谓词匹配的第一个项目。 如果你通过了一个。

(Nb。谓词是任何获取对象并返回bool的函数,有一个名为Predicate<T>的.Net类型代表它)

要整理它,你可以使用OfType linq运算符和null传播和null合并运算符来完成它

public static string GetLogFile()
{
    var fileTarget = LogManager.Configuration.AllTargets.OfType<FileTarget>().FirstOrDefault(t=>t.Name == "LogName");            
    return fileTarget?.FileName.Render(new LogEventInfo { Level = LogLevel.Info }) ?? string.Empty;
}

简单来说,

Where会为您提供一个可枚举的。 不会为空。 如果谓词中没有匹配项则为空。 FirstOrDefault会给你一个对象。 如果没有匹配则为空。

按照你的代码,它应该抛出一个编译错误,说它无法从IEnumerable转换为FileTarget。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM