[英]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")
返回我的日志文件的正确路径。 任何人都可以向我解释Where
和FirstOrDefault
之间是否存在重大差异?
在您的情况下, Where
返回对象FileTarget
的IEnumerable
(只是一个列表)。 然后,将此列表转换为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.