Best practices for modifying collection inplace with LINQ

29 views Asked by At

I have a collection with objects of different types, each of them inheriting from a class named Component. I then want to modify the collections by my needs nicely, with use of kind of declarative and fluent syntax.

For each item type in the collection i need to do other actions so i came up with the following LINQ style extension method:

public static IEnumerable<T> DoWith<T, T2>(this IEnumerable<T> items, Action<T2> action)
{
    foreach (var item in items)
    {
        if (item is T2 t)
            action(t);

        yield return item;
    }
}

So I call it like that:

myComponents
         .DoWith((ConstructionSiteComponent c) => c.structureTemplateKey = "newTemplate")
         .DoWith((EntityNameComponent c) => c.Name = $"Construction site for {origName}");

But surprise, nothing happens since the enumerable is not enumerated. Sure I can fix this by either actually using a foreach statement of even calling .ToArray() which internally enumerates the collection, but this all does not feel right.

I would also imagine instead of modifying items to actually replace them, but i guess the problem would also apply then also, right?

0

There are 0 answers