Home > Mobile >  Calling Select inside of List<> extended method in C#
Calling Select inside of List<> extended method in C#

Time:11-24

Just wondering why a Select call won't execute if it's called inside of an extended method? Or is it maybe that I'm thinking Select does one thing, while it's purpose is for something different?

Code Example:

var someList = new List<SomeObject>();
int triggerOn = 5;
/* list gets populated*/
someList.MutateList(triggerOn, "Add something", true);

MutateList method declaration:

    public static class ListExtension
    {
        public static IEnumerable<SomeObject> MutateList(this IEnumerable<SomeObject> objects, int triggerOn, string attachment, bool shouldSkip = false)
        {
            return objects.Select(obj =>
            {
                if (obj.ID == triggerOn)
                {
                    if (shouldSkip) shouldSkip = false;
                    else obj.Name  = $" {attachment}";
                }
                return obj;
            });
        }
     }

The solution without Select works. I'm just doing a foreach instead.

I know that the Select method has a summary saying: "Projects each element of a sequence into a new form." But if that were true, then wouldn't my code example be showing errors?

Solution that I used (Inside of the MutateList method):

        foreach(SomeObject obj in objects)
        {
            if (obj.ID == triggerOn)
            {
                if (shouldSkip) shouldSkip = false;
                else obj.Name  = $" {attachment}";
            }
        });
        return objects;

CodePudding user response:

Select uses deferred execution, meaning that it does not actually execute until you try to iterate over the results, with a ForEach, or using Linq methods that require the actual results like ToList or Sum.

Also, it returns an iterator, it does not run on the items in-place, but you're not capturing the return value in your calling code.

For those reasons - I would recommend not using Select to mutate the object in the list. You're just wrapping a ForEach call in a less clean way. I would just use ForEach within the method.

  • Related