C# Academy · Lektion

Aggregeringar och ToList

Räkna, summera och materialisera

Lektion 4 av 413 steg

Aggregeringar och ToList är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.

Räkna element

Count returnerar antalet element i en sekvens. Med ett predikat räknar den bara element som matchar predikatet.

Metoden tvingar fram iteration, så hela sekvensen gås igenom för att ta fram totalsumman – det är en aggregerande operation.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));

Summera värden

Sum adderar numeriska värden. För en numerisk sekvens summerar den elementen; med en väljare summerar den ett projicerat värde från varje element.

Den returnerar samma numeriska typ som källan eller resultatet från väljaren.

using System;
using System.Linq;
using System.Collections.Generic;

record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);

Beräkna medelvärden

Average beräknar det aritmetiska medelvärdet. Precis som Sum kan den ta emot en valfri väljare.

Resultatet är en flyttalstyp, till exempel double, även när källan består av heltal, så att divisionen inte förlorar precision.

using System;
using System.Linq;

int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);

Min och Max

Min och Max returnerar de minsta och största värdena. Med en väljare reducerar de en projicerad nyckel.

I moderna versioner av .NET returnerar MaxBy och MinBy hela elementet med den extrema nyckeln, inte bara nyckelvärdet.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);

Fallgropar med tomma sekvenser

För en tom sekvens kastar Average, Min och Max InvalidOperationException när de används med värdetyper. Sum returnerar noll och Count returnerar noll.

Använd Any() som kontroll eller använd DefaultIfEmpty före medelvärdesberäkning av data som kan vara tom.

using System;
using System.Linq;

int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);

Aggregate för anpassade vikningar

Aggregate viker ihop en sekvens till ett enda värde med hjälp av en ackumulatorfunktion. Det är den generella formen bakom Sum och andra metoder.

Du kan ange ett startvärde och kombinera varje element med ett löpande resultat – användbart för produkter, sammanfogningar eller anpassad logik.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);

Materialisera med ToList

ToList kör frågan omedelbart och kopierar resultaten till en List<T>. Det bryter medvetet den uppskjutna körningen.

Använd den för att ta en stabil ögonblicksbild, undvika att köra om en kostsam pipeline eller få tillgång till listfunktioner som indexering och egenskapen Count.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));

ToArray och ToDictionary

Relaterade materialiseringsmetoder är bland annat ToArray för en array med fast storlek och ToDictionary för nyckelbaserad uppslagning.

ToDictionary tar emot en nyckelväljare och eventuellt även en värdeväljare. Den kastar ett undantag om två element ger samma nyckel.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);

Varför materialisera

Frågor med uppskjuten körning körs om varje gång de itereras över. Om en pipeline är kostsam eller läser från en källa som förändras kan upprepningen orsaka buggar och långsam körning.

Genom att anropa ToList en gång sparar du resultaten, så att senare läsningar blir snabba och konsekventa.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);

First, Single och Any

Elementoperatorer tvingar också fram körning. First returnerar den första matchningen och kastar ett undantag om ingen finns, FirstOrDefault returnerar i stället standardvärdet och Single kräver exakt en matchning.

Any visar om en sekvens innehåller något matchande element utan att räkna alla element.

using System;
using System.Linq;

int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");

Hela pipelinen

Verkliga frågor kombinerar filtrering, projektion, sortering och aggregering och avslutas ofta med en materialiseringsmetod.

Läs den uppifrån och ned: filtrera, forma sedan resultatet, sortera därefter och samla slutligen in det. Det sista ToList-anropet kör hela pipelinen en gång.

using System;
using System.Linq;
using System.Collections.Generic;

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 9) };
var top = sales.Where(s => s.Amt > 4)
               .OrderByDescending(s => s.Amt)
               .Select(s => s.City)
               .ToList();
Console.WriteLine(string.Join(", ", top));

Snabbkontroll

Resonera kring uppskjuten körning och materialisering.

Sammanfattning

Aggregeringar reducerar en sekvens till ett värde: Count, Sum, Average, Min/Max, MinBy/MaxBy och den generella Aggregate. De tvingar fram körning och kan kasta undantag för tomma källor.

ToList, ToArray och ToDictionary materialiserar resultaten och bryter den uppskjutna körningen, så att en kostsam pipeline körs en gång. Därmed är verktygen för LINQ-filtrering och projektion kompletta.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Aggregeringar och ToList” gratis?

Ja – hela texten till ”Aggregeringar och ToList” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Aggregeringar och ToList”?

Räkna, summera och materialisera Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Aggregeringar och ToList”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Where och filtrering
  2. Select och projektion
  3. OrderBy och gruppering
  4. Aggregeringar och ToList
← Tillbaka till C# Academy