2009-05-23

ForEach w stylu LINQ

Pisząc przy użyciu LINQ chciałoby była to pierwsza rzecz jakiej mi brakowało. Bardzo często zdarzało mi się tworzyć zbiór obiektów poprzez LINQ, a następnie chciałem na każdym z nim wykonać jakąś operacje. Normalnie musiało by to wyglądać tak:
class TestObj
{
    public TestObj(int value)
    {
        Value = value;
    }

    public int Value;

    public void Operation()
    {
        System.Console.WriteLine(Value);
    }
}

public void Test()
{
    var obj_list = new[] { new TestObj(2), new TestObj(3), new TestObj(4), 
                           new TestObj(5), new TestObj(6) };

    var x = from obj in obj_list
            where obj.Value < 5
            select obj;
    foreach (var obj in x)
        obj.Operation();
}
Aby móc zapisać linie 20-24 w takiej postaci:
(from obj in obj_list
 where obj.Value < 5
 select obj).ForEach(obj => obj.Operation());
Potrzebujemy następującej metod rozszerzających:
public static class LINQExtensions
{
    [System.Diagnostics.DebuggerStepThrough]
    public static void ForEach(this IEnumerable enumerable, Action handler)
    {
        foreach (T item in enumerable)
            handler(item);
    }
}
Atrybut [System.Diagnostics.DebuggerStepThrough] zapewnia nam, że debagując nie wskoczymy w tą metodę. W przypadku, gdy za działanie metody jesteśmy pewni, zastosowanie tego atrybuty znacznie ułatwia debagowanie, sprawiając, że nie skaczemy jak głupi po kodzie.

Brak komentarzy:

Prześlij komentarz