В статье Используем 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)
1b5a2e05-758c-4b21-ad66-bab5090993f6|0|.0
Метки:
.net,
c#,
lambda expressions,
extensions,
samples
Категории:
.Net |
C# Extensions |
Lambda Expressions |
LINQ |
Samples