C# Academy · Oppitunti

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.

Oppitunti 2/38 vaihetta

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

Pikatarkistus: Minkä ehdon on täytyttävä, kun käytät ToDictionary(keySelector)-operaattoria sekvenssiin?

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.

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 ”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

  1. GroupBy, Join, Aggregate ja projektiot (anonyymit tyypit)
  2. Materiialisointi (ToList, ToDictionary) ja suorituskykyhuomiot
  3. Koostettavuusvinkit
← Takaisin: C# Academy