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
Повторение
Повторение: используйте 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 — локальная установка не требуется.
Все уроки этого курса
- GroupBy, Join, Aggregate и проекции (анонимные типы)
- Материализация (ToList, ToDictionary) и заметки о производительности
- Советы по композиции