{"id":30,"date":"2007-04-13T03:09:32","date_gmt":"2007-04-13T08:09:32","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=30"},"modified":"2013-08-13T09:40:30","modified_gmt":"2013-08-13T07:40:30","slug":"yield-keyword-an-lazy-evaluation-in-c","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/","title":{"rendered":"yield keyword and lazy evaluation in C#"},"content":{"rendered":"<p><i>yield<\/i> is a new contextual keyword introduced to C# 2.0, vital for lazy evaluation and the performance of queries in LINQ. Being a contextual keyword means that <i>yield<\/i> can be used as a variable name in C# without any problem. When put before return it becomes a keyword.<\/p>\n<p><i>yield<\/i> allows one enumerable class to be implemented in terms of another. This enables the delay of execution of queries until the latest possible moment, skipping the generation of intermediate results that would drastically reduce poerformance. The query operators in LINQ operate on sequence. The result of a query is often another sequence. Lazy evaluation means that until you iterate over the result of the query, the source of the query is not iterated.<\/p>\n<p>To show you how <i>yield<\/i> works, let&#8217;s consider the same class I used in my last <a href=\"http:\/\/mariusbancila.ro\/blog\/?p=27\">post<\/a>, Winner.<\/p>\n<pre class=\"csharp\" name=\"code\">\r\npublic class Winner\r\n{\r\n    string _name;\r\n    string _country;\r\n    int _year;\r\n\r\n    public string Name\r\n    {\r\n        get { return _name; }\r\n        set { _name = value; }\r\n    }\r\n    public string Country\r\n    {\r\n        get { return _country; }\r\n        set { _country = value; }\r\n    }\r\n    public int Year\r\n    {\r\n        get { return _year; }\r\n        set { _year = value; }\r\n    }\r\n    public Winner(string name, string country, int year)\r\n    {\r\n       _name = name;\r\n       _country = country;\r\n       _year = year;\r\n    }\r\n}\r\n<\/pre>\n<p>and create a class WinnerDB, that contains a list of UEFA Champion League winners. This class implements <tt>IEnumerable<\/tt> and returns an enumerator, <tt>WinnerEnumerator<\/tt>, to be able to iterate over the winners.<\/p>\n<p><pre class=\"csharp\" name=\"code\">\r\n    public class WinnerEnumerator : IEnumerator\r\n    {\r\n        int pos = -1;\r\n        private Winner[] _winners;\r\n        public WinnerEnumerator(Winner[] winners)\r\n        {\r\n            _winners = winners;\r\n        }\r\n\r\n        public void Reset()\r\n        {\r\n            pos = -1;\r\n        }\r\n\r\n        public bool MoveNext()\r\n        {\r\n            pos++;\r\n            return (pos < _winners.Length);\r\n        }\r\n\r\n        public object Current\r\n        {\r\n            get\r\n            {\r\n                try\r\n                {\r\n                    return _winners[pos];\r\n\r\n                }\r\n                catch (IndexOutOfRangeException)\r\n                {\r\n                    throw new InvalidOperationException();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    public class WinnersDB : IEnumerable\r\n    {\r\n        private Winner[] _winners;\r\n        public WinnersDB()\r\n        {\r\n            _winners = new Winner[]\r\n            {\r\n                new Winner(\"Barcelona\", \"Spain\", 2006),\r\n                new Winner(\"Liverpool\", \"England\", 2005),\r\n                new Winner(\"FC Porto\", \"Portugal\", 2004),\r\n                new Winner(\"AC Milan\", \"Italy\", 2003),\r\n                new Winner(\"Real Madrid\", \"Spain\", 2002),\r\n                new Winner(\"Bayern Munchen\", \"Germany\", 2001),\r\n                new Winner(\"Real Madrid\", \"Spain\", 2000),\r\n                new Winner(\"Manchester Utd.\", \"England\", 1999),\r\n                new Winner(\"Real Madrid\", \"Spain\", 1998),\r\n                new Winner(\"Olimpique Marseille\", \"France\", 1993),\r\n            };\r\n        }\r\n\r\n        public IEnumerator GetEnumerator()\r\n        {\r\n            return new WinnerEnumerator(_winners);\r\n        }\r\n    }\r\n<\/pre>\n<p>The usage of this class would look like this:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            WinnersDB db = new WinnersDB();\r\n            foreach (Winner w in db)\r\n            {\r\n                Console.WriteLine(\"{0}\\t{1}, {2}\",\r\n                    w.Year, w.Name, w.Country);\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>and the output of the program<\/p>\n<pre class=\"console\">\r\n2006    Barcelona, Spain\r\n2005    Liverpool, England\r\n2004    FC Porto, Portugal\r\n2003    AC Milan, Italy\r\n2002    Real Madrid, Spain\r\n2001    Bayern Munchen, Germany\r\n2000    Real Madrid, Spain\r\n1999    Manchester Utd., England\r\n1998    Real Madrid, Spain\r\n1993    Olimpique Marseille, France\r\n<\/pre>\n<p>So far so good. But with <i>yield<\/i>, you can let the compiler do all that stuff for you. When you use <i>yield<\/i>, the compiler generates an enumerator that keeps the current state of the iteration.<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nclass Program\r\n{\r\n    public static IEnumerable&lt;Winner&gt; WinnersDB()\r\n    {\r\n        Winner [] winners = new Winner[]\r\n        {\r\n                new Winner(\"Barcelona\", \"Spain\", 2006),\r\n                new Winner(\"Liverpool\", \"England\", 2005),\r\n                new Winner(\"FC Porto\", \"Portugal\", 2004),\r\n                new Winner(\"AC Milan\", \"Italy\", 2003),\r\n                new Winner(\"Real Madrid\", \"Spain\", 2002),\r\n                new Winner(\"Bayern Munchen\", \"Germany\", 2001),\r\n                new Winner(\"Real Madrid\", \"Spain\", 2000),\r\n                new Winner(\"Manchester Utd.\", \"England\", 1999),\r\n                new Winner(\"Real Madrid\", \"Spain\", 1998),\r\n                new Winner(\"Olimpique Marseille\", \"France\", 1993),\r\n        };\r\n\r\n        foreach (Winner w in winners)\r\n        {\r\n            yield return w;\r\n        }\r\n    }\r\n\r\n    static void Main(string[] args)\r\n    {\r\n        foreach (Winner w in WinnersDB())\r\n        {\r\n            Console.WriteLine(\"{0}\\t{1}, {2}\",\r\n                w.Year, w.Name, w.Country);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Running this code will produce the same output as the previous one, except that the implementation is much simpler. Perhaps the example is not the best, but should give you a hint of the use of the <i>yield<\/i> keyword. To see that the source is actually iterated only when the result is iterated, we can modify the <tt>WinnersDB<\/tt> method to print a message in the console:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nforeach (Winner w in winners)\r\n{\r\n    Console.WriteLine(\"yield: {0} {1}, {2}\", w.Year, w.Name, w.Country);\r\n    yield return w;\r\n}\r\n<\/pre>\n<p>In this case, the output looks like this:<\/p>\n<p><pre class=\"console\">\r\nyield: 2006 Barcelona, Spain\r\n2006    Barcelona, Spain\r\nyield: 2005 Liverpool, England\r\n2005    Liverpool, England\r\nyield: 2004 FC Porto, Portugal\r\n2004    FC Porto, Portugal\r\nyield: 2003 AC Milan, Italy\r\n2003    AC Milan, Italy\r\nyield: 2002 Real Madrid, Spain\r\n2002    Real Madrid, Spain\r\nyield: 2001 Bayern Munchen, Germany\r\n2001    Bayern Munchen, Germany\r\nyield: 2000 Real Madrid, Spain\r\n2000    Real Madrid, Spain\r\nyield: 1999 Manchester Utd., England\r\n1999    Manchester Utd., England\r\nyield: 1998 Real Madrid, Spain\r\n1998    Real Madrid, Spain\r\nyield: 1993 Olimpique Marseille, France\r\n1993    Olimpique Marseille, France\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>yield is a new contextual keyword introduced to C# 2.0, vital for lazy evaluation and the performance of queries in LINQ. Being a contextual keyword means that yield can be used as a variable name in C# without any problem. When put before return it becomes a keyword. yield allows one enumerable class to be &#8230; <a title=\"yield keyword and lazy evaluation in C#\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/\" aria-label=\"Read more about yield keyword and lazy evaluation in C#\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[11,14],"tags":[454,451,328],"class_list":["post-30","post","type-post","status-publish","format-standard","hentry","category-csharp","category-linq","tag-net","tag-c","tag-linq-2"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\".net,c++,linq\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"yield keyword and lazy evaluation in C#\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2007-04-13T08:09:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2013-08-13T07:40:30+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"yield keyword and lazy evaluation in C#\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#article\",\"name\":\"yield keyword and lazy evaluation in C#\",\"headline\":\"yield keyword and lazy evaluation in C#\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2007-04-13T03:09:32+02:00\",\"dateModified\":\"2013-08-13T09:40:30+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#webpage\"},\"articleSection\":\"C#, LINQ, .NET, C++, linq\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"position\":4,\"name\":\".NET\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"name\":\"C#\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"position\":5,\"name\":\"C#\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#listItem\",\"name\":\"yield keyword and lazy evaluation in C#\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#listItem\",\"position\":6,\"name\":\"yield keyword and lazy evaluation in C#\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"name\":\"C#\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/\",\"name\":\"yield keyword and lazy evaluation in C#\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/13\\\/yield-keyword-an-lazy-evaluation-in-c\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2007-04-13T03:09:32+02:00\",\"dateModified\":\"2013-08-13T09:40:30+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"yield keyword and lazy evaluation in C#","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/","robots":"max-image-preview:large","keywords":".net,c++,linq","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#article","name":"yield keyword and lazy evaluation in C#","headline":"yield keyword and lazy evaluation in C#","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2007-04-13T03:09:32+02:00","dateModified":"2013-08-13T09:40:30+02:00","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#webpage"},"articleSection":"C#, LINQ, .NET, C++, linq"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","position":4,"name":".NET","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","name":"C#"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","position":5,"name":"C#","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#listItem","name":"yield keyword and lazy evaluation in C#"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#listItem","position":6,"name":"yield keyword and lazy evaluation in C#","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","name":"C#"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/","name":"yield keyword and lazy evaluation in C#","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2007-04-13T03:09:32+02:00","dateModified":"2013-08-13T09:40:30+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"yield keyword and lazy evaluation in C#","og:url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/13\/yield-keyword-an-lazy-evaluation-in-c\/","article:published_time":"2007-04-13T08:09:32+00:00","article:modified_time":"2013-08-13T07:40:30+00:00","twitter:card":"summary","twitter:title":"yield keyword and lazy evaluation in C#"},"aioseo_meta_data":{"post_id":"30","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:04:51","updated":"2025-12-12 07:09:06","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":1,"uagb_excerpt":"yield is a new contextual keyword introduced to C# 2.0, vital for lazy evaluation and the performance of queries in LINQ. Being a contextual keyword means that yield can be used as a variable name in C# without any problem. When put before return it becomes a keyword. yield allows one enumerable class to be&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/\" class=\"advgb-post-tax-term\">C#<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/linq\/\" class=\"advgb-post-tax-term\">LINQ<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C#<\/span>","<span class=\"advgb-post-tax-term\">LINQ<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/linq\/\" class=\"advgb-post-tax-term\">.NET<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/linq\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/linq\/\" class=\"advgb-post-tax-term\">linq<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.NET<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">linq<\/span>"]}},"comment_count":"1","relative_dates":{"created":"Posted 19 years ago","modified":"Updated 13 years ago"},"absolute_dates":{"created":"Posted on April 13, 2007","modified":"Updated on August 13, 2013"},"absolute_dates_time":{"created":"Posted on April 13, 2007 3:09 am","modified":"Updated on August 13, 2013 9:40 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-u","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/30","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=30"}],"version-history":[{"count":2,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/30\/revisions"}],"predecessor-version":[{"id":1612,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/30\/revisions\/1612"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=30"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=30"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=30"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}