Aggregeringar och ToList
Räkna, summera och materialisera
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.
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
- Where och filtrering
- Select och projektion
- OrderBy och gruppering
- Aggregeringar och ToList