0Pricing
C# Academy · Lekcja

Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności

Proszę zamieniać odroczone zapytania na konkretne kolekcje za pomocą ToList/ToArray/ToDictionary, unikać wielokrotnego wyliczania oraz znać zasady unikatowości kluczy.

Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Dlaczego materializować

Zapytania odroczone są wykonywane przy każdej enumeracji.

  • Zmaterializuj zapytanie, aby utworzyć migawkę
  • Unikaj wielokrotnego wykonywania kosztownych zapytań
  • Wybierz List, Array lub Dictionary odpowiednio do zadania

ToList / ToArray

ToList/ToArray wykonują zapytanie raz i przechowują wyniki; późniejsze zmiany w źródle nie są odzwierciedlane.

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

Podstawy ToDictionary

ToDictionary materializuje sekwencję do obiektu Dictionary<K,V>. Klucze muszą być unikatowe, w przeciwnym razie metoda zgłasza wyjątek.

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

Duplikaty: ToLookup/GroupBy

Gdy klucze mogą się powtarzać, należy preferować ToLookup (słownik wielu wartości) lub GroupBy zamiast ToDictionary.

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);
    }
  }
}

Unikanie wielokrotnej enumeracji

Każda enumeracja może ponownie wykonać operacje. Należy zmaterializować wyniki raz (np. ToList), jeśli będą iterowane wielokrotnie.

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

Lista kontrolna materializacji

Lista kontrolna:

  • Należy używać ToList/ToArray do tworzenia migawek.
  • Należy używać ToDictionary, gdy klucze są unikatowe; w przeciwnym razie ToLookup/GroupBy.
  • Należy unikać wielokrotnej enumeracji kosztownych źródeł; wyniki należy buforować raz.
  • Należy materializować w pobliżu granic (I/O, wywołania DB), aby uzyskać przewidywalne działanie.

Wymaganie ToDictionary

Szybkie sprawdzenie: Co musi być prawdą podczas używania ToDictionary(keySelector) na sekwencji?

Podsumowanie

Podsumowanie: Materializuj za pomocą ToList/ToArray, aby tworzyć migawki, używaj ToDictionary do szybkiego wyszukiwania (unikatowe klucze), a wyniki buforuj, aby uniknąć ponownego wykonywania kosztownych zapytań.

Często zadawane pytania

Czy lekcja „Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności” jest bezpłatna?

Tak — pełny tekst „Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności”?

Proszę zamieniać odroczone zapytania na konkretne kolekcje za pomocą ToList/ToArray/ToDictionary, unikać wielokrotnego wyliczania oraz znać zasady unikatowości kluczy. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. GroupBy, Join, Aggregate i projekcje (typy anonimowe)
  2. Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności
  3. Wskazówki dotyczące kompozycyjności
← Powrót do C# Academy