C# Academy · Oppitunti

Select ja projektio

Muotoile data uusiin muotoihin.

Oppitunti 2/413 vaihetta

Select ja projektio on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä projektio tarkoittaa

Select muuntaa sekvenssin jokaisen alkion uuteen muotoon. Tätä kutsutaan projektioksi.

Se vastaanottaa lambdan, joka muuntaa yhden alkion tulokseksi, ja palauttaa näistä tuloksista koostuvan sekvenssin muuttamatta lähdettä.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));

Tyypin muuttaminen

Projektio voi muuttaa alkioiden tyypin kokonaan. int-arvojen muuntaminen string-arvoiksi tuottaa IEnumerable<string>-sekvenssin.

Tulostyyppi päätellään lambdan palautustyypistä, joten kääntäjä seuraa sitä puolestanne.

using System;
using System.Linq;

int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);

Ominaisuuksien projisointi

Yleinen käyttötapaus on poimia objekteilta yksi ominaisuus. Select(p => p.Name) muuntaa objektilistan nimien listaksi.

Näin tiedot rajataan vain tarvitsemaanne sisältöön ennen jatkokäsittelyä tai näyttämistä.

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));

Nimettömän tyypin tulokset

Voitte projisoida tuloksen nimettömään tyyppiin, jos haluatte pitää useita kenttiä yhdessä. Käyttäkää lambdan sisällä ilmaisua new { ... }.

Kääntäjä luo lennossa luokan, jonka ominaisuudet ovat vain luettavia. Tämä sopii erinomaisesti välitulosten muotoiluun.

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");

Select indeksin kanssa

Kuten Where-metodilla, myös Select-metodilla on nollapohjaisen indeksin tarjoava ylikuormitus. Lambda vastaanottaa parametrit (element, index).

Tämä sopii erinomaisesti alkioiden numerointiin tai kunkin arvon yhdistämiseen sen sijaintiin.

using System;
using System.Linq;

string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);

Select kyselysyntaksissa

Kyselysyntaksissa select-lause tekee projektion. Voitte valita itse alkion tai minkä tahansa siihen perustuvan lausekkeen.

Yhdistämällä sen where-lauseeseen voitte suodattaa ja muotoilla tuloksen yhdessä helposti luettavassa kyselyssä.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
             where n % 2 == 1
             select n * 10;
Console.WriteLine(string.Join(", ", result));

SelectMany litistää

Kun jokainen alkio muunnetaan kokoelmaksi, Select tuottaisi sekvenssien sekvenssin. SelectMany litistää nämä yhdeksi sekvenssiksi.

Se vastaa LINQ:ssa sisäkkäistä silmukkaa, joka ketjuttaa sisäiset tulokset.

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

var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));

Myös projektio on lykätty

Select käyttää samaa lykättyä suoritusmallia. Muunnoslambdan suoritus tapahtuu vasta, kun sekvenssi luetellaan.

Projektion muodostaminen on siis edullista; työ tehdään vasta, kun tulos käydään läpi tai muodostetaan konkreettiseksi kokoelmaksi.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");

Suodata ja projisoi

Järjestyksellä on merkitystä selkeyden ja tehokkuuden kannalta: suodattakaa ensin Where-metodilla ja projisoikaa sen jälkeen Select-metodilla, jotta muunnatte vain säilytettävät alkiot.

Tämä putki etenee ylhäältä alas luettavasti ja välttää turhan projektiotyön.

using System;
using System.Linq;

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

Projisointi uuteen tietueeseen

Nimettömien tyyppien sijaan voitte projisoida tuloksen nimettyyn tyyppiin tai record-tyyppiin. Tämä on hyödyllistä, kun tulokset kulkevat metodien rajojen yli, koska nimettömiä tyyppejä ei voi palauttaa tunnetulla nimellä.

Näin muodostetaan myös DTO:t rikkaammista toimialueobjekteista.

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

record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);

Select säilyttää järjestyksen ja lukumäärän

Toisin kuin Where, Select ei koskaan lisää tai poista alkioita, vaan muuntaa ne yksi yhteen. Tuloksen alkioiden lukumäärä ja järjestys ovat samat kuin syötteessä.

Jos tarvitsette vähemmän alkioita, käyttäkää suodatusta; jos tarvitsette kustakin alkiosta useampia alkioita, käyttäkää SelectMany-metodia.

using System;
using System.Linq;

int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");

Pikatarkistus

Valitkaa tehtävään sopiva operaattori.

Kertaus

Select projisoi jokaisen alkion uuteen muotoon, kuten ominaisuudeksi, merkkijonoksi, nimettömäksi tyypiksi tai tietueeksi, säilyttäen lukumäärän ja järjestyksen yksi yhteen. Sillä on indeksin tarjoava ylikuormitus, ja sen suoritus on lykättyä.

SelectMany litistää sisäkkäiset sekvenssit. Seuraavaksi lajittelemme ja ryhmittelemme muotoilemamme tiedot.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”Select ja projektio” ilmainen?

Kyllä – oppitunnin ”Select ja projektio” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Select ja projektio”?

Muotoile data uusiin muotoihin. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Select ja projektio”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Where ja suodatus
  2. Select ja projektio
  3. OrderBy ja ryhmittely
  4. Aggregaatit ja ToList
← Takaisin: C# Academy