- •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 Совместное использование запросов и методов
Продолжение таблицы 7.4
Наименование |
|
Описание |
|
FindLast |
Возвращает последний узел (класса LinkedListNode<T>), |
||
(T value) |
имеющий значение value. Если узел не найден, то воз- |
||
|
|||
|
вращается null. Например: |
|
|
|
LinkedList<int> l = new LinkedList<int>(); |
||
|
l.AddLast(5); |
// |
l = {5} |
|
l.AddLast(8); |
// |
l = {5, 8} |
|
l.AddLast(9); |
// |
l = {5, 8, 9} |
|
l.AddLast(8); |
// |
l = {5, 8, 9, 8} |
|
LinkedListNode<int> node = l.FindLast(8); |
||
|
// node = 8 (четвёртый узел) |
||
|
node = l.FindLast(6); // node = null |
||
|
|
|
|
7.4.4 Класс Queue<T>
Представляет собой класс очереди, работающей по принципу FIFO («первый пришёл – первый ушёл»). Некоторые члены класса приведены в таблице 7.5.
Таблица 7.5 – Некоторые члены класса Queue<T>
Наименование |
|
Описание |
Count |
Возвращает количество элементов в очереди |
|
Enqueue |
Добавляет в конец очереди новый элемент со значением |
|
(T item) |
item. Например: |
|
|
Queue<int> q = new Queue<int>(); |
|
|
q.Enqueue(5); |
// q = {5} |
|
q.Enqueue(8); |
// q = {5, 8} (начало слева) |
Dequeue() |
Забирает из начала очереди элемент класса T и возвращает |
|
|
его. Если очередь пуста, то при выполнении операции воз- |
|
|
никнет исключение. Например: |
|
|
Queue<int> q = new Queue<int>(); |
|
|
q.Enqueue(5); |
// q = {5} |
|
q.Enqueue(8); |
// q = {5, 8} (начало слева) |
|
int i = q.Dequeue(); |
// i = 5, q = {8} |
|
|
|
Peek() |
Получает из начала очереди элемент класса T но не забира- |
|
|
ет его из очереди. Если очередь пуста, то при выполнении |
|
|
операции возникнет исключение. Например: |
|
|
Queue<int> q = new Queue<int>(); |
|
|
q.Enqueue(5); |
// q = {5} |
|
q.Enqueue(8); |
// q = {5, 8} (начало слева) |
|
int i = q.Peek(); |
// i = 5, q = {5, 8} |
|
|
|
Clear() |
Удаляет все элементы из очереди |
117
7.4.5 Класс Stack<T>
Представляет собой класс очереди, работающей по принципу LIFO («последний пришёл – первый ушёл»), называемую также стеком. Некоторые члены класса приведены в таблице 7.6.
Таблица 7.6 – Некоторые члены класса Stack<T>
Наименование |
|
Описание |
Count |
Возвращает количество элементов в стеке |
|
Push |
Добавляет в вершину стека новый элемент со значением |
|
(T item) |
item. Например: |
|
|
Stack<int> st = new Stack<int>(); |
|
|
st.Push(5); |
// st = {5} |
|
st.Push(8); |
// st = {8, 5} (верх слева) |
Pop() |
Забирает из вершины стека элемент класса T и возвращает |
|
|
его. Если стек пуст, то при выполнении операции возник- |
|
|
нет исключение. Например: |
|
|
Stack<int> st = new Stack<int>(); |
|
|
st.Push(5); |
// st = {5} |
|
st.Push(8); |
// st = {8, 5} (верх слева) |
|
int i = st.Pop(); |
// i = 8, st = {5} |
Peek() |
Получает из вершины стека элемент класса T но не забира- |
|
|
ет его из стека. Если стек пуст, то при выполнении опера- |
|
|
ции возникнет исключение. Например: |
|
|
Stack<int> st = new Stack<int>(); |
|
|
st.Push(5); |
// st = {5} |
|
st.Push(8); |
// st = {8, 5} (верх слева) |
|
int i = st.Peek(); // i = 8, st = {8, 5} |
|
|
|
|
Clear() |
Удаляет все элементы из стека |
7.4.6 Классы SortedSet<T> и HashSet<T>
Представляют собой множества объектов. Множество может содержать только уникальные объекты.
Отличие между классами заключается в том, что класс SortedSet<T> упорядоченный, а класс HashSet<T> – неупорядоченный, но высокопроизводительный.
Если класс T пользовательский, то в нем должен быть реализован интерфейс IComparable<T>. Также во многих случаях требуется перегрузка метода Equals.
Некоторые члены классов приведены в таблице 7.7.
118
Таблица 7.7 – Некоторые члены классов SortedSet<T> и HashSet<T>1
Наименование |
|
Описание |
|
|
Count |
Возвращает количество элементов в множестве |
|||
Max |
Возвращает объект класса T, |
имеющий максимальное зна- |
||
|
чение. Если множество пустое, то возвращается значение |
|||
|
по умолчанию для класса T. |
|
|
|
Min |
Возвращает объект класса T, |
имеющий минимальное зна- |
||
|
чение. Если множество пустое, то возвращается значение |
|||
|
по умолчанию для класса T. |
|
|
|
Add |
Добавляет в множество новый элемент со значением item |
|||
(T item) |
и возвращает результат добавления типа bool (true, если |
|||
|
||||
|
добавление произведено, и false в противном случае). |
|||
|
Например: |
|
|
|
|
SortedSet<int> s = new SortedSet<int>(); |
|||
|
bool b = s.Add(8); |
// b = |
true, |
s = {8} |
|
b = s.Add(5); |
// b = |
true, |
s = {5, 8} |
|
b = s.Add(8); |
// b = |
false, s = {5, 8} |
|
|
|
|
||
Clear() |
Удаляет все элементы из множества |
|
||
CopyTo |
Копирует множество в одномерный массив начиная с пер- |
|||
(T[] array) |
вого элемента массива (с индекса 0). Например: |
|||
|
SortedSet<int> s = new SortedSet<int>(); |
|||
|
s.Add(5); |
// s = |
{5} |
|
|
s.Add(2); |
// s = |
{2, 5} |
|
|
s.Add(7); |
// s = |
{2, 5, 7} |
|
|
int[] mas = new int[s.Count]; |
|
||
|
s.CopyTo(mas); |
// mas |
= {2, 5, 7} |
|
|
|
|||
Contains |
Проверяет, входит ли элемент item во множество. Воз- |
|||
(T item) |
вращает значение типа bool. Например: |
|||
|
||||
|
SortedSet<int> s = new SortedSet<int>(); |
|||
|
s.Add(5); |
|
// s = {5} |
|
|
s.Add(2); |
|
// s = {2, 5} |
|
|
s.Add(7); |
|
// s = {2, 5, 7} |
|
|
bool b = s.Contains(7); |
// b = true |
||
|
b = s.Contains(8); |
|
// b = false |
|
|
|
|
|
|
1 Примеры приводятся для класса SortedSet<T>
119
Продолжение таблицы 7.7
Наименование |
|
Описание |
|
Remove |
Удаляет из множества элемент со значением item и воз- |
||
(T item) |
вращает результат удаления типа bool (true, если удале- |
||
|
|||
|
ние произведено, и false в противном случае). Например: |
||
|
SortedSet<int> s = new SortedSet<int>(); |
||
|
bool b = s.Add(8); |
// b = true, |
s = {8} |
|
b = s.Add(5); |
// b = true, |
s = {5, 8} |
|
b = s.Remove(8); |
// b = true, |
s = {5} |
|
b = s.Remove(9); |
// b = false, s = {5} |
|
RemoveWhere |
Удаляет из множества элементы, удовлетворяющие усло- |
||
(Predicate<T> |
вию match и возвращает количество удалённых элементов. |
||
match) |
Требуется реализация метода, проверяющего требуемое |
||
|
|||
|
условие. Например: |
|
|
|
class MyClass : IComparable<MyClass> |
||
|
{ |
|
|
|
public int value; |
|
|
|
public MyClass(int NewValue) |
|
{value = NewValue; } public static int V;
public static bool Upper(MyClass Find)
{return Find.value > V; }
public int CompareTo(MyClass other) { return value - other.value; }
|
} |
|
|
SortedSet<MyClass> s = new SortedSet<MyClass>(); |
|
|
s.Add(new MyClass(5)); |
// s = {5} |
|
s.Add(new MyClass(2)); |
// s = {2, 5} |
|
s.Add(new MyClass(7)); |
// s = {2, 5, 7} |
|
s.Add(new MyClass(3)); |
// s = {2, 3, 5, 7} |
|
MyClass.V = 4; |
|
|
int i = s.RemoveWhere(MyClass.Upper); |
|
|
// i = 2, s = {2, 3} |
|
|
i = s.RemoveWhere(MyClass.Upper); |
|
|
// i = 0, s = {2, 3} |
|
|
|
|
ExceptWith |
Изменяет множество так, |
чтобы оно содержало элементы, |
(IEnumerable<T> |
не входящие в коллекцию other. Например: |
|
other) |
|
|
|
SortedSet<int> s1 = new SortedSet<int>(); |
|
|
s1.Add(5); |
|
|
s1.Add(2); |
|
|
s1.Add(7); |
// s1 = {2, 5, 7} |
|
SortedSet<int> s2 = new SortedSet<int>(); |
|
|
s2.Add(4); |
|
|
s2.Add(7); |
// s2 = {4, 7} |
|
s1.ExceptWith(s2); |
// s1 = {2, 5} |
120
Продолжение таблицы 7.7
Наименование |
Описание |
|
|
|
IntersectWith |
Изменяет множество так, |
чтобы |
оно содержало |
только |
(IEnumerable<T> |
элементы, входящие в коллекцию other. Например: |
|
||
other) |
|
|
|
|
|
SortedSet<int> s1 = new SortedSet<int>(); |
|
||
|
s1.Add(5); |
|
|
|
|
s1.Add(2); |
|
|
|
|
s1.Add(7); |
|
|
|
|
s1.Add(3); |
// s1 = {2, 3, 5, 7} |
||
|
SortedSet<int> s2 = new SortedSet<int>(); |
|
||
|
s2.Add(4); |
|
|
|
|
s2.Add(2); |
|
|
|
|
s2.Add(7); |
// s2 = {2, 4, 7} |
|
|
|
s1.IntersectWith(s2); |
// s1 = {2, 7} |
|
|
UnionWith |
Изменяет множество так, чтобы оно содержало элементы, |
|||
(IEnumerable<T> |
входящие как в множество, так и в коллекцию |
other. |
||
other) |
Например: |
|
|
|
|
|
|
|
|
|
SortedSet<int> s1 = new SortedSet<int>(); |
|
||
|
s1.Add(5); |
|
|
|
|
s1.Add(2); |
|
|
|
|
s1.Add(7); |
// s1 = {2, 5, 7} |
|
|
|
SortedSet<int> s2 = new SortedSet<int>(); |
|
||
|
s2.Add(4); |
|
|
|
|
s2.Add(9); |
|
|
|
|
s2.Add(7); |
// s2 = {4, 7, 9} |
|
|
|
s1.UnionWith(s2); |
// s1 = {2, 4, 5, 7, 9} |
||
IsSubsetOf |
Проверяет, является ли множество подмножеством коллек- |
|||
(IEnumerable<T> |
ции other. Например: |
|
|
|
other) |
|
|
|
|
|
SortedSet<int> s1 = new SortedSet<int>(); |
|
||
|
s1.Add(5); |
|
|
|
|
s1.Add(2); |
|
// s1 = {2, 5} |
|
|
SortedSet<int> s2 = new SortedSet<int>(); |
|
||
|
s2.Add(2); |
|
|
|
|
s2.Add(7); |
|
|
|
|
s2.Add(5); |
|
// s2 = {2, 5, 7} |
|
|
SortedSet<int> s3 = new SortedSet<int>(); |
|
||
|
s2.Add(2); |
|
|
|
|
s2.Add(7); |
|
|
|
|
s2.Add(4); |
|
// s3 = {2, 4, 7} |
|
|
bool b = s1.IsSubsetOf(s2); |
// b = true |
|
|
|
b = s1.IsSubsetOf(s3); |
|
// b = false |
|
121