Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot
Muuntaa viivästetyt kyselyt konkreettisiksi kokoelmiksi ToList-, ToArray- ja ToDictionary-menetelmillä, välttäkää toistuvaa läpikäyntiä ja tutustukaa avainten yksikäsitteisyyttä koskeviin sääntöihin.
Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/3. 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ä 3 oppituntia.
Miksi materialisoida
Viivästetyt kyselyt suoritetaan aina uudelleen, kun luettelet niiden tulokset.
- Ota tilannekuva materialisoimalla tulokset
- Vältä kalliiden kyselyiden suorittamista useita kertoja
- Valitse tehtävään sopiva List, Array tai Dictionary
ToList / ToArray
ToList/ToArray suorittaa kyselyn kerran ja tallentaa tulokset. Myöhemmät lähteen muutokset eivät näy tuloksissa.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
List<int> data = new List<int>(new int[] { 1, 2, 3, 4 });
var evensQuery = data.Where(x => x % 2 == 0);
int[] evensArray = evensQuery.ToArray(); // snapshot now
List<int> evensList = evensQuery.ToList(); // snapshot now
data.Add(6); // changes after materialization
Console.WriteLine("Array:");
foreach (int x in evensArray) Console.WriteLine(x); // 2,4
Console.WriteLine("List:");
foreach (int x in evensList) Console.WriteLine(x); // 2,4
}
}
ToDictionary-perusteet
ToDictionary materialisoi tulokset Dictionary<K,V>-tyyppiseksi sanakirjaksi. Avainten on oltava yksilöllisiä, muuten operaatio heittää poikkeuksen.
using System;
using System.Collections.Generic;
using System.Linq;
public sealed class City
{
public string Name;
public int Population;
public City(string name, int pop){ Name = name; Population = pop; }
}
public class Program
{
public static void Main(string[] args)
{
var cities = new City[]
{
new City("Oslo", 634000),
new City("Rome", 2873000),
new City("Riga", 605000)
};
Dictionary<string, int> byName = cities
.ToDictionary(c => c.Name, c => c.Population);
Console.WriteLine(byName["Rome"]); // 2873000
}
}
Kaksoiskappaleet: ToLookup/GroupBy
Jos avaimet voivat toistua, käytä mieluummin ToLookup-operaattoria eli moniarvoista sanakirjaa tai GroupBy-operaattoria ToDictionaryn sijaan.
using System;
using System.Collections.Generic;
using System.Linq;
public sealed class Item { public string Category; public string Name; public Item(string c, string n){ Category=c; Name=n; } }
public class Program
{
public static void Main(string[] args)
{
var items = new Item[]
{
new Item("Food","Apple"),
new Item("Food","Bread"),
new Item("Tool","Hammer"),
new Item("Tool","Wrench")
};
// If keys may repeat, use ToLookup (multi-value) or GroupBy
var lookup = items.ToLookup(i => i.Category, i => i.Name);
foreach (var g in lookup)
{
Console.WriteLine(g.Key + ":");
foreach (var name in g) Console.WriteLine(" - " + name);
}
}
}
Usean luetteloinnin välttäminen
Jokainen luettelointi voi suorittaa työn uudelleen. Materialisoi tulokset kerran, esimerkiksi ToList-operaattorilla, kun iteroit niitä useita kertoja.
using System;
using System.Collections.Generic;
using System.Linq;
public static class Expensive
{
public static IEnumerable<int> Numbers()
{
// Simulate expensive enumeration (prints when enumerated)
for (int i = 1; i <= 3; i++)
{
Console.WriteLine("Produce " + i);
yield return i;
}
}
}
public class Program
{
public static void Main(string[] args)
{
var query = Expensive.Numbers().Select(x => x * x);
Console.WriteLine("First pass:");
foreach (int x in query) Console.WriteLine(x);
Console.WriteLine("Second pass (re-enumerates work):");
foreach (int x in query) Console.WriteLine(x);
Console.WriteLine("Cache with ToList:");
List<int> cached = query.ToList(); // runs once
foreach (int x in cached) Console.WriteLine(x); // no extra production logs
}
}
Materialisoinnin tarkistuslista
Tarkistuslista:
- Ota tilannekuva käyttämällä ToList/ToArray-operaattoria.
- Käytä ToDictionary-operaattoria, kun avaimet ovat yksilöllisiä. Muussa tapauksessa käytä ToLookup- tai GroupBy-operaattoria.
- Vältä kalliiden lähteiden luettelemista useita kertoja. Tallenna tulokset kerran välimuistiin.
- Materialisoi tulokset rajapinnoilla, kuten I/O- ja tietokantakutsujen yhteydessä, jotta toiminta on ennakoitavaa.
ToDictionaryn vaatimus
Kertaus
Kertaus: Materialisoi tulokset ToList/ToArray-operaattorilla tilannekuvia varten, käytä ToDictionary-operaattoria nopeaan hakuun yksilöllisillä avaimilla ja välimuistia, jotta kalliita kyselyitä ei suoriteta uudelleen.
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 ”Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot” ilmainen?
Kyllä – oppitunnin ”Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot” 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ä 3 oppituntia.
Mitä opin oppitunnilla ”Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot”?
Muuntaa viivästetyt kyselyt konkreettisiksi kokoelmiksi ToList-, ToArray- ja ToDictionary-menetelmillä, välttäkää toistuvaa läpikäyntiä ja tutustukaa avainten yksikäsitteisyyttä koskeviin sääntöihin. 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/3.
Kuinka kauan ”Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot”-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
- GroupBy, Join, Aggregate ja projektiot (anonyymit tyypit)
- Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot
- Koostettavuusvinkit