Материализация (ToList, ToDictionary) и заметки о производительности
Преобразуйте отложенные запросы в конкретные коллекции с помощью ToList/ToArray/ToDictionary; избегайте повторного перечисления и учитывайте правила уникальности ключей.
«Материализация (ToList, ToDictionary) и заметки о производительности» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
Зачем нужна материализация
Отложенные запросы выполняются при каждом перечислении.
- Материализуйте данные, чтобы получить снимок
- Избегайте многократного повторного выполнения дорогих запросов
- Выбирайте List, Array или Dictionary в зависимости от задачи
ToList / ToArray
ToList/ToArray выполняют query один раз и сохраняют результаты; последующие изменения источника не отражаются в них.
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
ToDictionary материализует данные в Dictionary<K,V>. Ключи должны быть уникальными, иначе будет выброшено исключение.
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
}
}
Дубликаты: ToLookup/GroupBy
Если ключи могут повторяться, вместо ToDictionary выбирайте ToLookup (словарь с несколькими значениями) или GroupBy.
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);
}
}
}
Как избежать многократного перечисления
Каждое перечисление может повторно запускать вычисления. Материализуйте данные один раз (например, с помощью ToList), если собираетесь перебирать их несколько раз.
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
}
}
Список проверки материализации
Список проверки:
- Используйте ToList/ToArray, чтобы создать снимок.
- Используйте ToDictionary, если ключи уникальны; в противном случае — ToLookup/GroupBy.
- Избегайте многократного перечисления дорогих источников; создайте один кэш.
- Материализуйте данные рядом с границами (вводом-выводом, обращениями к БД) для предсказуемого поведения.
Требование ToDictionary
Повторение
Повторение: материализуйте данные с помощью ToList/ToArray, чтобы получать снимки, используйте ToDictionary для быстрого поиска (с уникальными ключами) и создавайте кэш, чтобы не запускать дорогие запросы повторно.
Часто задаваемые вопросы
Урок «Материализация (ToList, ToDictionary) и заметки о производительности» бесплатный?
Да — полный текст урока «Материализация (ToList, ToDictionary) и заметки о производительности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «Материализация (ToList, ToDictionary) и заметки о производительности»?
Преобразуйте отложенные запросы в конкретные коллекции с помощью ToList/ToArray/ToDictionary; избегайте повторного перечисления и учитывайте правила уникальности ключей. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Материализация (ToList, ToDictionary) и заметки о производительности»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- GroupBy, Join, Aggregate и проекции (анонимные типы)
- Материализация (ToList, ToDictionary) и заметки о производительности
- Советы по композиции