Filtering enumerables using C# Yield

Oct 13, 2012 csharp dotnet

I just found something cool I haven't been using in Linq so I thought I would share here.

When enumerating through a collection of IEnumerable, you can use the yeild statement to return items during runtime enumeration.

For example if I had a set of ShoppingCartItems held in an IEnumerable, and ShoppingCartItem has a Category, I could filter with an extension method like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ShoppingCartExample
{
    public interface IShoppingCartItem
    {
        string Description { get; set; }
        double Cost { get; set; }
        string Category { get; set; }
    }
    public static class Filters
    {
        public static IEnumerable<IShoppingCartItem> Filter(this IEnumerable<IShoppingCartItem> instance string Category)
        {
            foreach (IShoppingCartItem item in instance)
            {
                if (item.Category == Category)
                {
                    yield return item;
                }
            }
        }
    }

}

Example usage:

// declare a cart
List cart = new List();

// add items
cart.Add(new ShoppingCartItem() { Category = "Toys", Cost = 1.23D, Description = "Monopoly" });
cart.Add(new ShoppingCartItem() { Category = "Fruit", Cost = 0.50D, Description = "Apple" });

// filter the items - not yet evaluated
IEnumerable results = Filters.Filter("Fruit");

// all items will be yielded during enumeration here
int count = results.Count; // will return 1

Related Content