AsEnumerable会在这个例子中提高效率吗?

时间:2015-02-11 19:20:33

标签: performance linq

在以下代码中:

    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一次评估一个元素,或者数组是否仍然完全实现?

(我意识到如果我只是使用&&&&和一个香草表达,这是没有实际意义的 - 我只是想完全理解这个例子)

2 个答案:

答案 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。这不会有任何区别。