GetEnumerator extension method

En ganska enkel men ytterst trevligt tillägg i C# version 9 är möjligheten att skapa en extension method av GetEnumerator (som konsulteras när en samling ska enumereras). Betrakta denna lilla lista:

var people = new List<string>
{
    "Sven",
    "Nils",
    "Niklas",
    "Janne"
};

Om jag skulle vilja ha samtliga poster i listan för utskrift på skärmen, kan denna kod användas:

foreach (var p in people)
    Console.WriteLine(p);

GetEnumerator används implicit. Men om jag bara är intresserad av att ha med poster vars förnamn börjar på N, så måste det formuleras någonstans. Jag kan t.ex. kopiera listan och exkludera ointressanta poster, eller så skulle jag kunna iterera genom svaret från LINQ-API:et enligt:

foreach (var p in people.Where(x => x.StartsWith("N")))
    Console.WriteLine(p);

Extension methods har fördelen att de är tillgängliga i filer som läst in dess namnrymd, men är i övrigt otillgängliga. Det innebär att man kan begränsa funktionalitet till vissa filer genom att skapa en extension metod. Om jag generellt sett är intresserad av att ha personerna som börjar på N tillgängliga i den aktuella filen (eller på annat sätt kunna använda manipulerat data) kan jag deklarera en egen GetEnumerator som en extension method. Är den tillgänglig, kommer kompilatorn att välja den. I detta fall kommer man troligtvis att vilja ha full tillgänglighet för metoden.

static class MyEnumerator
{
    public static IEnumerator<T> GetEnumerator<T>(this IEnumerator<T> list) =>
        list;
}

Med denna på plats, öppnas en ny möjlighet. Svaret från den funktionen, kan itereras. Nu kan jag skapa en enumerator som t.ex. skickar tillbaka personerna som börjar på N. Med det gjort, blir iterationen lika enkel som i första exemplet, fast med den skillnaden att jag nu kontrollerar dess innehåll.


var somePeople = people
   .Where(x => x.StartsWith("N"))
   .GetEnumerator();

foreach (var p in somePeople)
    Console.WriteLine(p);

Detta är egentligen inte en stor sak, men det bidrar till kodens elegans – något som har blivit ett av kännetecknen för C#.

Leave a Reply

Your email address will not be published. Required fields are marked *