为什么我从类似的Linq查询中获得不同的输出?

时间:2018-03-14 19:06:05

标签: c# linq linqpad

我在LinqPad 5中尝试以下代码(特别是5.26.01)

     IEnumerable<string> breeds = new List<string>{
        "Fantail",
        "Lahore",
        "Bokhara Trumpeter",
        "Rhine Ringbeater",
        "Birmingham Roller",
        "Pomeranian Pouter",
        "Racing Homer",
        "Archangel"};

    IEnumerable<string> GetAllBreedsContainingLetter_Fluent(IEnumerable<string> breedlist, string letter)
    {
        return breedlist
            .Where(breedname => breedname.Contains(letter.ToUpperInvariant()) || breedname.Contains(letter.ToLowerInvariant()))
            .OrderByDescending(breedname => breedname)
            .Select(breedname => breedname);
    }

    IEnumerable<string> GetAllBreedsContainingLetter_Query(IEnumerable<string> breedlist, string letter)
    {
        return breedlist = from b in breedlist
                            where (b.Contains(letter.ToUpperInvariant()) || b.Contains(letter.ToLowerInvariant()))
                            orderby b descending
                            select b;
    }

    var breedsFluent = GetAllBreedsContainingLetter_Fluent(breeds, "R");
    breedsFluent.Dump();

    var breedsQuery = GetAllBreedsContainingLetter_Query(breeds, "R");
    breedsQuery.Dump();

我认为这两个函数应该类似,但我注意到Linqpad中的输出有些奇怪。第一个.Dump()被标识为IEnumerable<String>;第二个.Dump()标识为IOrderedEnumerable<String>

LinqPadOutput

这是关于我正在运行的查询还是Linqpad的工件?我从谷歌搜索中找不到任何东西。

1 个答案:

答案 0 :(得分:2)

在查询语法中,转换是这样的,当你有一个简单的投影(将一个项目投射到自身)时,生成一个Select调用,当那个简单的投影是仅查询中的操作。由于您的查询包含其他操作,因为性能原因,Select完全被省略。

将查询语法查询正确转换为方法语法将跳过Select。使用查询语法复制行为的方法需要像第二个查询那样进行简单的投影。