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
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
- GroupBy, Join, Aggregate i projekcje (typy anonimowe)
- Materializacja (ToList, ToDictionary) i uwagi dotyczące wydajności
- Wskazówki dotyczące kompozycyjności