Aggregater og ToList
Tell, summer og materialiser.
Aggregater og ToList er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Telle elementer
Count returnerer antallet elementer i en sekvens. Med et predikat teller den bare elementer som oppfyller betingelsen.
Den tvinger frem iterasjon, så hele sekvensen gjennomgås for å finne totalen – dette er en aggregeringsoperasjon.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));Summere verdier
Sum legger sammen numeriske verdier. For en numerisk sekvens summerer den elementene; med en velger summerer den en beregnet verdi fra hvert element.
Den returnerer samme numeriske type som kilden eller resultatet fra velgeren.
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);Beregne gjennomsnitt
Average beregner det aritmetiske gjennomsnittet. I likhet med Sum kan den ta imot en valgfri velger.
Resultatet er en flyttallstype, for eksempel double, selv når kilden består av heltall, slik at divisjonen ikke mister presisjon.
using System;
using System.Linq;
int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);Min og maks
Min og Max returnerer de minste og største verdiene. Med en velger finner de minimums- eller maksimumsverdien for en beregnet nøkkel.
I moderne .NET returnerer MaxBy og MinBy hele elementet med den mest ekstreme nøkkelen, ikke bare nøkkelverdien.
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);Fallgruver med tomme sekvenser
For en tom sekvens utløser Average, Min og Max InvalidOperationException når de brukes på verdityper. Sum returnerer null, og Count returnerer null.
Bruk Any() som kontroll, eller bruk DefaultIfEmpty før du beregner gjennomsnittet av data som kan være tomme.
using System;
using System.Linq;
int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);Aggregate for egendefinerte foldinger
Aggregate folder en sekvens til én verdi ved hjelp av en akkumulatorfunksjon. Det er den generelle formen som ligger bak Sum og andre aggregater.
Du kan oppgi en startverdi og kombinere hvert element med et løpende resultat – nyttig for produkter, sammenkjedinger eller egendefinert logikk.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);Materialisere med ToList
ToList utfører spørringen umiddelbart og kopierer resultatene til en List<T>. Dette avslutter utsatt kjøring med hensikt.
Bruk den for å ta et stabilt øyeblikksbilde, unngå å kjøre en kostbar pipeline på nytt eller få listefunksjoner som indeksering og 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 og ToDictionary
Beslektede materialiseringsmetoder er blant annet ToArray for en matrise med fast størrelse og ToDictionary for nøkkelbaserte oppslag.
ToDictionary tar en nøkkelvelger og eventuelt en verd velger, og utløser et unntak hvis to elementer gir samme nøkkel.
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"]);Hvorfor materialisere
Utsatte spørringer kjøres på nytt hver gang de itereres. Hvis en pipeline er kostbar eller leser fra en kilde som endres, kan denne gjentakelsen føre til feil og treghet.
Hvis du kaller ToList én gang, lagres resultatene slik at senere lesninger blir raske og konsistente.
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 og Any
Elementoperatorer tvinger også frem kjøring. First returnerer det første treffet og utløser et unntak hvis det ikke finnes noen, FirstOrDefault returnerer standardverdien i stedet, og Single krever nøyaktig ett element.
Any forteller deg om en sekvens har minst ett element som oppfyller betingelsen, uten å telle alle elementene.
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}");Hele pipelinen
Virkelige spørringer kjeder ofte sammen filtrering, projisering, sortering og aggregering, og avsluttes gjerne med en materialiseringsmetode.
Les spørringen ovenfra og ned: filtrer, form resultatet, sorter og samle det. Den siste ToList kjører hele pipelinen én gang.
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));Hurtigsjekk
Resonner om utsatt kjøring og materialisering.
Oppsummering
Aggregater reduserer en sekvens til en verdi: Count, Sum, Average, Min/Max, MinBy/MaxBy og det generelle Aggregate. De tvinger frem kjøring og kan utløse et unntak for tomme kilder.
ToList, ToArray og ToDictionary materialiserer resultater og avslutter den utsatte kjøringen, slik at en kostbar pipeline kjøres én gang. Dette fullfører verktøysettet for filtrering og projisering i LINQ.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Aggregater og ToList» gratis?
Ja – hele teksten i «Aggregater og ToList» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Aggregater og ToList»?
Tell, summer og materialiser. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Aggregater og ToList»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Where og filtrering
- Select og projeksjon
- OrderBy og gruppering
- Aggregater og ToList