LINQ中的FirstOrDefault是否具有延迟执行特性?

3

考虑以下陈述:

StandardLookUpList analysisSport = lookupItem.Where(w => w.Code == Constants.Sport).FirstOrDefault();

代码将多次引用 analysisSport,这个语句会被评估多次吗?

如果它会被评估多次,是否有办法使其只评估一次?

就像你可以使用 ToList() 立即且仅一次地评估LINQ一样。


1
“FirstOrDefault”在枚举中的作用与“ToList”相同,只会枚举一次。 - DavidG
@DavidG 如果您能够发布一个带有参考文献的答案,我将很乐意接受。 - paparazzo
2个回答

6
FirstOrDefaultToList 在枚举时仅枚举一次具有相同的效果。
唯一需要关注多重枚举的时间实际上是当您拥有一个可枚举对象时!由于 FirstOrDefault 返回具体对象(或者当然是 null),因此在这里没有任何东西来枚举。
还有一个潜在的陷阱就是任何 analysisSport 的子属性都是 IEnumerable,根据它们的基础类型,它们可能会被多次枚举。

1

.Where 会查找所有符合条件的元素,然后使用 .FirstOrDefault 返回从 .Where 获取的可枚举列表中的第一个元素,除非它为空,否则将返回 null。

执行该行代码后,不会再次评估它。

如果您想要再次评估它,您将需要重新设置它:

StandardLookUpList analysisSport = lookupItem.Where(w => w.Code == Constants.Sport).FirstOrDefault();

// now changing the variable to show cars instead of sports
analysisSport = lookupItem.Where(w => w.Code == Constants.Cars).FirstOrDefault();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接