Why the order of LINQ to objects methods counts

前端 未结 5 2111
一整个雨季
一整个雨季 2021-02-14 15:58

I read this question\'s answers that explain the order of the LINQ to objects methods makes a difference. My question is why?

If I write a LINQ to SQL query, it doesn\'t

5条回答
  •  别跟我提以往
    2021-02-14 16:45

    Why it doesn't work this way with LINQ to objects?

    LINQ to Objects doesn't use expression trees. The statement is directly turned into a series of method calls, each of which runs as a normal C# method.

    As such, the following in LINQ to Objects:

       var results = collection.OrderBy(x => x.Id)
                       .Where(x => x.Name == "gdoron")
                       .ToList();
    

    Gets turned into direct method calls:

       var results = Enumerable.ToList(
                       Enumerable.Where(
                         Enumerable.OrderBy(collection, x => x.Id),
                         x => x.Name = "gdoron"
                       )
                     );
    

    By looking at the method calls, you can see why ordering matters. In this case, by placing OrderBy first, you're effectively nesting it into the inner-most method call. This means the entire collection will get ordered when the resutls are enumerated. If you were to switch the order:

       var results = collection
                       .Where(x => x.Name == "gdoron")
                       .OrderBy(x => x.Id)
                       .ToList();
    

    Then the resulting method chain switches to:

       var results = Enumerable.ToList(
                       Enumerable.OrderBy(
                         Enumerable.Where(collection, x => x.Name = "gdoron"),
                         x => x.Id
                       )
                     );
    

    This, in turn, means that only the filtered results will need to be sorted as OrderBy executes.

提交回复
热议问题