OrderBy og gruppering
Sortér og gruppér resultater.
OrderBy og gruppering er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Sortering med OrderBy
OrderBy sorterer en sekvens i stigende rækkefølge efter en nøgle, du vælger. Lambdaen returnerer den værdi, der skal sorteres efter.
Den returnerer en ny sorteret sekvens og er stabil, hvilket betyder, at elementer med samme nøgle bevarer deres indbyrdes oprindelige rækkefølge.
using System;
using System.Linq;
int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));Faldende rækkefølge
OrderByDescending sorterer fra størst til mindst efter den valgte nøgle.
Brug den direkte i stedet for først at sortere stigende og derefter vende rækkefølgen — den udtrykker hensigten tydeligt og sorterer i én gennemgang.
using System;
using System.Linq;
int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));Sortering efter en egenskab
For objekter vælger du den egenskab, der skal sorteres efter. OrderBy(p => p.Age) sorterer personer fra yngst til ældst.
Nøglen kan være enhver sammenlignelig type — tal, strenge, datoer — eller hvad som helst, der implementerer IComparable.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);Sekundær sortering med ThenBy
ThenBy tilføjer en ekstra sorteringsnøgle. Efter OrderBy sorterer den elementer, der har samme primærnøgle, efter en anden nøgle.
Du kan kæde flere kald til ThenBy/ThenByDescending sammen for sortering på flere niveauer.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");Hvorfor ikke en anden OrderBy
Et andet kald til OrderBy giver ikke en ekstra sorteringsnøgle — det andet kald sorterer hele sekvensen igen og kasserer den første sortering.
Ved sortering i flere lag skal du altid bruge ThenBy efter den første OrderBy.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);orderby i forespørgselssyntaks
Forespørgselssyntaks har en orderby-sætning. Angiv flere nøgler adskilt af kommaer, eventuelt med descending.
orderby p.Age, p.Name descending sorterer efter alder og derefter efter navn i omvendt rækkefølge ved ens alder.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));Gruppering med GroupBy
GroupBy opdeler en sekvens i grupper med samme nøgle. Den returnerer en sekvens af IGrouping<TKey, TElement>.
Hver gruppering viser sin Key og kan selv gennemløbes for at få elementerne i gruppen.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");Gruppens nøgle og elementer
Hver gruppes Key identificerer opdelingen, og et gennemløb af gruppen giver dens elementer. Du kan kalde Count() direkte på en gruppe.
Sådan bygger du histogrammer, optællinger og fordelinger efter kategori.
using System;
using System.Linq;
string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
Console.WriteLine($"{g.Key}: {g.Count()}");Gruppér og projekter derefter
Et almindeligt mønster er at projektere hver gruppe til et opsummeringsobjekt ved hjælp af Select efter GroupBy.
Du læser Key og sammenlægger elementerne — f.eks. et antal eller en sum pr. gruppe.
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", 2) };
var totals = sales.GroupBy(s => s.City)
.Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");GroupBy med elementvælger
GroupBy har en overbelastning, der tager en anden lambda-funktion — en elementvælger — som bestemmer, hvad hver gruppe gemmer, og ikke kun hvordan den grupperes.
Her grupperer vi efter by, men gemmer kun beløbene.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");Sortering og gruppering udskydes
Både OrderBy og GroupBy bruger udskudt kørsel — de kører, når sekvensen gennemløbes. Bemærk dog, at sortering og gruppering skal gennemgå hele kilden for at kunne fremstille det første element.
I modsætning til Where behandler de derfor ikke data løbende; omkostningen kommer ved det første gennemløb.
using System;
using System.Linq;
int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));Hurtigt tjek
Tænk over sortering på flere niveauer.
Opsummering
OrderBy/OrderByDescending sorterer efter en nøgle; ThenBy tilføjer ekstra sorteringsnøgler. Et andet OrderBy sorterer hele sekvensen igen og fungerer ikke som en ekstra sorteringsnøgle.
GroupBy opdeler sekvensen i IGrouping-objekter med en Key og elementer, som ofte projekteres til opsummeringer. Begge dele bruger udskudt kørsel, men gennemgår hele kilden. Næste gang aggregerer og materialiserer vi resultater.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “OrderBy og gruppering” gratis?
Ja — hele teksten til “OrderBy og gruppering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “OrderBy og gruppering”?
Sortér og gruppér resultater. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “OrderBy og gruppering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Where og filtrering
- Select og projektion
- OrderBy og gruppering
- Aggregeringer og ToList