在以下代码中:
private bool IsValid()
{
return new[]
{
User.GetProfileAttributeByName("1"),
User.GetProfileAttributeByName("2"),
User.GetProfileAttributeByName("3"),
User.GetProfileAttributeByName("4")
}.All(c => c != null);
}
我认为发生的是阵列完全具体化,调用User.GetProfileAttributeByName
4次,然后在第一次遇到null
时全部短路。
以下内容:
private bool IsValid()
{
return new[]
{
User.GetProfileAttributeByName("1"),
User.GetProfileAttributeByName("2"),
User.GetProfileAttributeByName("3"),
User.GetProfileAttributeByName("4")
}.AsEnumerable().All(c => c != null);
}
导致All
一次评估一个元素,或者数组是否仍然完全实现?
(我意识到如果我只是使用&&&&和一个香草表达,这是没有实际意义的 - 我只是想完全理解这个例子)
答案 0 :(得分:5)
它没有任何区别 - 数组初始化不会被懒惰地评估,并且使用AsEnumerable
将不会改变它。
您可以通过将查询更改为
来懒惰地评估它 return new[]
{
"1",
"2",
"3",
"4"
}.Select(s => User.GetProfileAttributeByName(s))
.All(c => c != null);
然后Select
将延迟评估,All
将短路。
或只是
return new[]
{
"1",
"2",
"3",
"4"
}.All(s => User.GetProfileAttributeByName(s) != null);
答案 1 :(得分:0)
数组已经是Enumerable
。这不会有任何区别。