0Pricing
C# Academy · Урок

GroupBy, Join, Aggregate и проекции (анонимные типы)

Группируйте элементы, объединяйте последовательности, сворачивайте их с помощью Aggregate и создавайте удобные результаты через анонимные типы.

«GroupBy, Join, Aggregate и проекции (анонимные типы)» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Обзор расширенных операторов

Сегодня:

  • GroupBy: создаёт группы по ключу
  • Join: объединяет две последовательности по ключу
  • Aggregate: сводит последовательность к одному значению
  • Анонимные типы: упорядочивают проекции

Группировка по ключу

GroupBy создаёт группы с ключом и внутренней последовательностью элементов, имеющих этот ключ.

using System;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    string[] words = new string[] { "ant", "cat", "tiger", "lion", "dog", "eagle" };

    var groups = words.GroupBy(w => w.Length);

    foreach (var g in groups)
    {
      Console.WriteLine("Len " + g.Key + ":");
      foreach (string w in g) Console.WriteLine(" - " + w);
    }
  }
}

Внутреннее соединение по ключу

Join сопоставляет элементы из двух последовательностей по ключу и формирует объединённый результат.

using System;
using System.Linq;

public sealed class Customer { public int Id; public string Name; public Customer(int id, string name){ Id=id; Name=name; } }
public sealed class Order    { public int CustomerId; public string Item; public Order(int cid, string item){ CustomerId=cid; Item=item; } }

public class Program
{
  public static void Main(string[] args)
  {
    var customers = new Customer[] { new Customer(1,"Ada"), new Customer(2,"Bob") };
    var orders    = new Order[]    { new Order(1,"Book"), new Order(1,"Pen"), new Order(2,"Map") };

    var joined = customers.Join(
      orders,
      c => c.Id,
      o => o.CustomerId,
      (c, o) => c.Name + " -> " + o.Item);

    foreach (string s in joined) Console.WriteLine(s);
  }
}

Основы Aggregate

Aggregate применяет аккумулятор, чтобы свести последовательность к одному результату. Выбирайте подходящее начальное значение.

using System;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    int[] xs = new int[] { 1, 2, 3, 4 };

    // Product with seed 1
    int product = xs.Aggregate(1, (acc, n) => acc * n);
    Console.WriteLine("Product = " + product); // 24

    // Join words with a separator using seed
    string[] words = new string[] { "a", "b", "c" };
    string csv = words.Aggregate("", (acc, w) => acc == "" ? w : acc + "," + w);
    Console.WriteLine(csv); // a,b,c
  }
}

Проекция анонимного типа

Используйте анонимные типы для аккуратных проекций: new { Name = c.Name, ... } или сокращённую запись new { c.Name }.

using System;
using System.Linq;

public sealed class City { public string Name; public int Pop; public City(string n,int p){ Name=n; Pop=p; } }

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

    var small = cities
      .Where(c => c.Pop < 1000000)
      .Select(c => new { c.Name, Millions = (c.Pop / 1000000.0) });

    foreach (var x in small)
    {
      Console.WriteLine(x.Name + " ~ " + x.Millions + "M");
    }
  }
}

Практические советы

Советы:

  • После GroupBy перебирайте сначала группы, а затем элементы.
  • Используйте Join, когда у Вас есть два источника с совпадающими ключами.
  • Выбирайте осмысленное начальное значение для Aggregate.
  • Анонимные типы предназначены для локального использования; из общедоступных API возвращайте конкретные DTO.

Назначение GroupBy

Быстрая проверка: какой оператор LINQ группирует элементы по ключу и возвращает последовательность групп?

Повторение

Повторение: используйте GroupBy для создания групп, Join для объединения источников, Aggregate для сведения к одному значению, а анонимные типы — для аккуратных проекций.

Часто задаваемые вопросы

Урок «GroupBy, Join, Aggregate и проекции (анонимные типы)» бесплатный?

Да — полный текст урока «GroupBy, Join, Aggregate и проекции (анонимные типы)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «GroupBy, Join, Aggregate и проекции (анонимные типы)»?

Группируйте элементы, объединяйте последовательности, сворачивайте их с помощью Aggregate и создавайте удобные результаты через анонимные типы. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «GroupBy, Join, Aggregate и проекции (анонимные типы)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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