0Pricing
C# Academy · Урок

Материализация (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

Быстрая проверка: какое условие должно выполняться при использовании ToDictionary(keySelector) для последовательности?

Повторение

Повторение: материализуйте данные с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. GroupBy, Join, Aggregate и проекции (анонимные типы)
  2. Материализация (ToList, ToDictionary) и заметки о производительности
  3. Советы по композиции
← Назад к C# Academy