Используем C# опреатор yield, Эпизод 2

В статье Используем C# опреатор yield я описал как пользоваться оператором yield для быстрого создания результирующих коллекций, а как сделать тоже сомое но с выборкой по условию. Создадим расширение подобное LINQ расширению Where, для этого для элементов, которые не удовлетворяю условиям вызываем оператор yield break:

using System;
using System.Collections.Generic; 


namespace BlendWorld.YieldOperatorEpisode2
{
    public static class LinqExtensions
    {
        public static IEnumerable<T> YieldWhere<T>(this IEnumerable<T> source, Predicate<T> selector)
        {
            foreach (var item in source)
            {
                if (selector(item))
                {
                    yield return item;
                }
                else
                {
                    yield break;
                }
            }
        }
    }
}

Тестируем, незабывая использовать Lambda выражения:

using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting; 


namespace BlendWorld.YieldOperatorEpisode2.Test
{
    [TestClass]
    public class LinqExtensionsTests
    {
        private readonly int[] array = {0, 1, 2, 2, 5, 10, 7, 4, 3, 5, 11}; 


        [TestMethod]
        public void TestMethod1()
        {
            foreach (var item in array.YieldWhere(f=> f < 10))
            {
                Debug.WriteLine(string.Format("Item = {0}", item));
            }
        }
    }
}

Результат:

Item = 0
Item = 1
Item = 2
Item = 2
Item = 5

Скачать исходный код примера: BlendWorld.YieldOperatorEpisode2.zip (7,06 kb)


Метки: , , , ,
Категории: .Net | C# Extensions | Lambda Expressions | LINQ | Samples

Комментарии

18.03.2009 14:48:36 #

Это больше похоже на YieldWhile.
Для IEnumerable.Where результат:
Item = 0
Item = 1
Item = 2
Item = 2
Item = 5
Item = 7
Item = 4
Item = 3
Item = 5

quiz

19.03.2009 17:58:00 #

Согласен, убираем else блок и получаем Where

blind

Комментарии закрыты

Об авторе

Name of author Григорий Полищук

.Net программист



Написать мне Send mail

Реклама

Рекомендую

Последние записи

Последние коментарии

Comment RSS

Статистика