Gå til indholdet

N294 Udvidelse af LINQ med en “alle primtal”

I denne opgave skal du udvide LINQ’s funktionalitet med en metode til at filtrere primtal fra en liste af tal. Du skal skabe en tom konsol-applikation og tilføje en klasse kaldet PrimtalExtensions. I denne klasse skal du implementere en statisk metode AllePrimtal, der tager en IEnumerable<int> som input og returnerer en ny liste, der kun indeholder primtal.

Det skal fungere således:

List<int> talListe = new List<int> { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
var primtal = talListe.AllePrimtal();

og du kan evt benytte denne (ikke optimerede) metode til at finde primtal:

bool ErPrimtal(int tal)
{
    if (tal <= 1) return false;
    if (tal == 2) return true;
    if (tal % 2 == 0) return false;

    var grænse = (int)Math.Floor(Math.Sqrt(tal));

    for (int i = 3; i <= grænse; i += 2)
    {
        if (tal % i == 0) return false;
    }

    return true;
}
Klik for at se et forslag til en løsning
using System;
using System.Collections.Generic;
using System.Linq;

namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> talListe = new List<int> { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
            var primtal = talListe.AllePrimtal();

            foreach (var tal in primtal)
            {
                Console.WriteLine(tal);
            }
        }
    }

    public static class PrimtalExtensions
    {
        public static IEnumerable<int> AllePrimtal(this IEnumerable<int> tal)
        {
            return tal.Where(ErPrimtal);
        }

        private static bool ErPrimtal(int tal)
        {
            if (tal <= 1) return false;
            if (tal == 2) return true;
            if (tal % 2 == 0) return false;

            var grænse = (int)Math.Floor(Math.Sqrt(tal));

            for (int i = 3; i <= grænse; i += 2)
            {
                if (tal % i == 0) return false;
            }

            return true;
        }
    }
}