using System;
using System.Linq ;
using System.Collections .Generic ;
public class Test
{
private static bool veryExpensiveMethod( int number)
{
Console.WriteLine ( "veryExpensiveMethod called" ) ;
return true ;
}
public static void Main( )
{
var numbers = new [ ] { 1 , 2 , 3 , 4 , 5 } ;
IEnumerable< int> nums = numbers.Where ( i=> veryExpensiveMethod( i) ) ;
// deferred
int count = nums.Count ( ) ;
Console.WriteLine ( "Numbers: {0}" , count) ;
// following will execute veryExpensiveMethod again 5 times(because 5 elements are in the "filtered" sequence)
nums = nums.ToList ( ) ;
// not deferred, using the Count property of List<T>
count = nums.Count ( ) ;
Console.WriteLine ( "Numbers: {0}" , count) ;
// following Count() will not call 'veryExpensiveMethod' implicitely because nums is now a List<T>
count = nums.Count ( ) ;
count = nums.Count ( ) ;
count = nums.Count ( ) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCB2ZXJ5RXhwZW5zaXZlTWV0aG9kKGludCBudW1iZXIpCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidmVyeUV4cGVuc2l2ZU1ldGhvZCBjYWxsZWQiKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCSB2YXIgbnVtYmVycyA9IG5ldyBbXXsxLDIsMyw0LDV9OwoJIElFbnVtZXJhYmxlPGludD4gbnVtcyA9IG51bWJlcnMuV2hlcmUoaT0+IHZlcnlFeHBlbnNpdmVNZXRob2QoaSkpOwoJIC8vIGRlZmVycmVkCgkgaW50IGNvdW50ID0gbnVtcy5Db3VudCgpOwoJIENvbnNvbGUuV3JpdGVMaW5lKCJOdW1iZXJzOiB7MH0iLCBjb3VudCk7CgkgLy8gZm9sbG93aW5nIHdpbGwgZXhlY3V0ZSB2ZXJ5RXhwZW5zaXZlTWV0aG9kIGFnYWluIDUgdGltZXMoYmVjYXVzZSA1IGVsZW1lbnRzIGFyZSBpbiB0aGUgImZpbHRlcmVkIiBzZXF1ZW5jZSkKCSBudW1zID0gbnVtcy5Ub0xpc3QoKTsKCSAvLyBub3QgZGVmZXJyZWQsIHVzaW5nIHRoZSBDb3VudCBwcm9wZXJ0eSBvZiBMaXN0PFQ+CgkgY291bnQgPSBudW1zLkNvdW50KCk7CgkgQ29uc29sZS5Xcml0ZUxpbmUoIk51bWJlcnM6IHswfSIsIGNvdW50KTsKCSAvLyBmb2xsb3dpbmcgQ291bnQoKSB3aWxsIG5vdCBjYWxsICd2ZXJ5RXhwZW5zaXZlTWV0aG9kJyBpbXBsaWNpdGVseSBiZWNhdXNlIG51bXMgaXMgbm93IGEgTGlzdDxUPgoJIGNvdW50ID0gbnVtcy5Db3VudCgpOwoJIGNvdW50ID0gbnVtcy5Db3VudCgpOwoJIGNvdW50ID0gbnVtcy5Db3VudCgpOwoJfQp9