IEnumerable vs List - What to Use? How do they work?

后端 未结 10 2125
臣服心动
臣服心动 2020-11-22 03:57

I have some doubts over how Enumerators work, and LINQ. Consider these two simple selects:

List sel = (from animal in Animals 
                         


        
10条回答
  •  终归单人心
    2020-11-22 04:20

    A class that implement IEnumerable allows you to use the foreach syntax.

    Basically it has a method to get the next item in the collection. It doesn't need the whole collection to be in memory and doesn't know how many items are in it, foreach just keeps getting the next item until it runs out.

    This can be very useful in certain circumstances, for instance in a massive database table you don't want to copy the entire thing into memory before you start processing the rows.

    Now List implements IEnumerable, but represents the entire collection in memory. If you have an IEnumerable and you call .ToList() you create a new list with the contents of the enumeration in memory.

    Your linq expression returns an enumeration, and by default the expression executes when you iterate through using the foreach. An IEnumerable linq statement executes when you iterate the foreach, but you can force it to iterate sooner using .ToList().

    Here's what I mean:

    var things = 
        from item in BigDatabaseCall()
        where ....
        select item;
    
    // this will iterate through the entire linq statement:
    int count = things.Count();
    
    // this will stop after iterating the first one, but will execute the linq again
    bool hasAnyRecs = things.Any();
    
    // this will execute the linq statement *again*
    foreach( var thing in things ) ...
    
    // this will copy the results to a list in memory
    var list = things.ToList()
    
    // this won't iterate through again, the list knows how many items are in it
    int count2 = list.Count();
    
    // this won't execute the linq statement - we have it copied to the list
    foreach( var thing in list ) ...
    

提交回复
热议问题