
- •1 Основные сведения о C#
- •1.1 Особенности языка
- •1.2 Типы данных
- •1.3 Переменные
- •1.4 Константы (литералы)
- •1.5 Операторы, используемые при построении выражений
- •1.6 Класс Object
- •1.7 Класс Math
- •1.8 Класс Convert
- •1.9 Пространство имён
- •1.10 Типы, допускающие значение null
- •2 Операторы и конструкции С#
- •2.1 Операторы присваивания
- •2.2 Приведение типов
- •2.3 Операторы инкремента и декремента
- •2.4 Операторные скобки {}
- •2.5 Условный оператор if
- •2.6 Логические операторы «И» и «ИЛИ»
- •2.7 Условный оператор ? :
- •2.8 Оператор выбора switch и оператор прерывания break
- •2.9 Оператор цикла for
- •2.10 Оператор цикла while
- •2.11 Оператор цикла do...while
- •2.12 Операторы прерываний break (для циклов) и continue
- •2.13 Оператор new
- •2.14 Массивы
- •2.14.1 Одномерные массивы
- •2.14.2 Многомерные массивы
- •2.14.3 Ступенчатые массивы
- •2.14.4 Работа с массивами как с объектами
- •2.15 Оператор цикла foreach
- •2.16 Строки
- •2.17 Перечисления
- •2.18 Обработка исключений
- •2.18.1 Класс Exception и стандартные исключения
- •2.18.2 Блок try...catch
- •2.18.3 Блок try...finally
- •2.18.4 Блок try...catch...finally
- •2.18.5 Оператор throw
- •3 Классы. Основные понятия
- •3.1 Общая схема
- •3.2 Спецификаторы доступа
- •3.3 Поля
- •3.4 Создание объекта и доступ к его членам
- •3.5 Методы
- •3.5.1 Перегрузка методов
- •3.5.2 Новое в версии C# 4.0
- •3.6 Конструкторы
- •3.7 Деструкторы
- •3.8 Инициализаторы объектов
- •3.9 Свойства
- •3.10 Индексаторы
- •4 Классы. Расширенное использование
- •4.1 Статические классы и члены классов
- •4.2 Наследование
- •4.2.1 Наследование и конструкторы
- •4.2.2 Переопределение членов класса
- •4.3 Полиморфизм
- •4.3.1 Виртуальные методы
- •4.3.2 Абстрактные классы и члены классов
- •4.3.3 Операторы as и is
- •4.3.4 Модификатор sealed
- •4.4 Перегрузка операторов
- •5 Интерфейсы
- •6 Делегаты, лямбда-выражения и события
- •6.1 Делегаты
- •6.2 Анонимные методы и лямбда-выражения
- •6.3 События
- •7 Универсальные типы
- •7.1 Общая схема
- •7.2 Ограничения по параметрам типа
- •7.2.1 Ограничение на базовый класс
- •7.2.2 Ограничение на интерфейс
- •7.2.3 Ограничение на конструктор
- •7.2.4 Ограничения ссылочного типа и типа значения
- •7.3 Параметры типы в методах
- •7.4 Некоторые универсальные типы С#
- •7.4.1 Класс Array
- •7.4.2 Класс List<T>
- •7.4.3 Класс LinkedList<T>
- •7.4.4 Класс Queue<T>
- •7.4.5 Класс Stack<T>
- •7.4.6 Классы SortedSet<T> и HashSet<T>
- •7.4.7 Классы Dictionary<TKey, TValue> и SortedDictionary<TKey, TValue>
- •8 Работа с файлами
- •8.1 Класс File
- •8.2 Работа с файлами как с потоками
- •8.2.1 Класс FileStream
- •8.2.2 Класс StreamReader
- •8.2.3 Класс StreamWriter
- •8.2.4 Класс BinaryReader
- •8.2.5 Класс BinaryWriter
- •9 LINQ
- •9.1 Программные конструкции и типы, используемые LINQ
- •9.1.1 Методы расширения
- •9.1.2 Анонимные типы
- •9.1.3 Интерфейс IEnumerable<T>
- •9.2 Построение запросов на LINQ
- •9.2.1 Общая структура запроса
- •9.2.2 Простой запрос
- •9.2.3 where : использование условий отбора
- •9.2.4 orderby : использование сортировки
- •9.2.5 select : определение возвращаемого значения
- •9.2.1 group : группировка данных
- •9.2.1 into : обработка результатов группировки
- •9.2.1 let : временные переменные в запросе
- •9.2.2 from : использование нескольких источников данных
- •9.2.3 join : соединение данных из нескольких источников
- •9.3 Получение результатов с использованием методов
- •9.3.1 Метод Where
- •9.3.2 Метод Select
- •9.3.3 Методы сортировки
- •9.3.4 Метод GroupBy
- •9.3.5 Метод Join
- •9.3.6 Дополнительные методы интерфейса IEnumerable<T>
- •9.4 Совместное использование запросов и методов
9.3.5 Метод Join
Метод Join(inner, outerKeySelector, innerKeySelector, resultSelector) используется для соединения двух наборов данных по некоторому признаку. Параметры данного метода имеют следующее назначение:
inner – последовательность, с которой производится соединение;
outerKeySelector – реализация делегата Func, входным параметром которого является элемент исходной последовательности, а выходным – значение, по которому осуществляется соединение с элементов второй последовательности;
innerKeySelector – реализация делегата Func, входным параметром которого является элемент второй последовательности, а выходным – значение, по которому осуществляется соединение с элементов исходной последовательности;
resultSelector – реализация делегата Func, входными параметрами которого является элементы последовательностей, а выходным – результирующее значение для заданной пары элементов.
Пример 1: вывести студентов в алфавитном порядке фамилий с указанием в
скобках группы обучения. Вывод осуществлять в компонент Result_TB класса TextBox (реализация с помощью лямбда-выражений).
class Group |
|
|
{ |
|
|
public int ID; |
// Уникальный идентификатор группы |
|
public string Name; |
// Наименование группы |
|
} |
|
|
class Student |
|
|
{ |
|
|
public string Surname; |
// Фамилия студента |
|
public int YearOfBirth; |
// Год рождения студента |
|
public int GroupID; |
// Принадлежность к группе |
|
} |
|
|
Group[] Groups = new Group[4]; |
|
|
Groups[0] = new Group() { ID = 1, Name = "АБВ" }; |
|
|
Groups[1] = new Group() { ID = 2, Name = "ННН" }; |
|
|
Groups[2] = new Group() { ID = 3, Name = "ЯАП" }; |
|
|
Groups[3] = new Group() { ID = 4, Name = "КЕП" }; |
|
|
Student[] Students = new Student[6]; |
|
|
Students[0] = new Student() { Surname = "Иванов", |
|
|
|
YearOfBirth = 1990, |
GroupID = 1 }; |
Students[1] = new Student() { Surname = "Петров", |
|
|
|
YearOfBirth = 1985, GroupID = 4 }; |
|
Students[2] = new Student() { Surname = "Смирнов", |
|
|
|
YearOfBirth = 1990, |
GroupID = 3 }; |
Students[3] = new Student() { Surname = "Антонов", |
|
|
|
YearOfBirth = 1993, |
GroupID = 1 }; |
Students[4] = new Student() { Surname = "Иванов", |
|
|
|
YearOfBirth = 1993, |
GroupID = 4 }; |
167
Students[5] = new Student() { Surname = "Петров",
YearOfBirth = 1992, GroupID = 4 };
var Result = Groups.Join(Students, g => g.ID, s => s.GroupID, (g, s) => new { gName = g.Name, sName = s.Surname })
.OrderBy(p => p.sName);
Result_TB.Clear(); foreach (var p in Result)
Result_TB.AppendText(p.sName + " (" + p.gName + ")\n");
Результат будет выведен в виде:
Антонов (АБВ) Иванов (АБВ) Иванов (КЕП) Петров (КЕП) Петров (КЕП) Смирнов (ЯАП)
Пример 2: реализация предыдущего примера с помощью методов.
int F1(Group g)
{
return g.ID;
}
int F2(Student s)
{
return s.GroupID;
}
class GS
{
public string gName, sName;
}
GS F3(Group g, Student s)
{
return new GS() { gName = g.Name, sName = s.Surname };
}
string F4(GS p)
{
return p.sName;
}
var Result = Groups.Join(Students, F1, F2, F3)
.OrderBy(F4);
168