Similar presentations:
Объектно-ориентированное программирование
1. Объектно-ориентированное программирование
Лекция №3-42. Коллекции
Во многих приложениях требуется создавать группы связанных
объектов и управлять ими. Существует два способа группировки
объектов: создать массив объектов и создать коллекцию.
Массивы удобнее всего использовать для создания фиксированного
числа строго типизированных объектов и работы с ними.
Коллекции предоставляют более гибкий способ работы с группами
объектов. В отличие от массивов, коллекция, с которой вы работаете,
может расти или уменьшаться динамически при необходимости.
Некоторые коллекции допускают назначение ключа любому объекту,
который добавляется в коллекцию, чтобы в дальнейшем можно было
быстро извлечь связанный с ключом объект из коллекции.
3. Универсальные коллекции
Коллекция является классом, поэтому необходимо объявить
экземпляр класса перед добавлением в коллекцию элементов.
Если коллекция содержит элементы только одного типа
данных, можно использовать один из классов в пространстве имен
System.Collections.Generic. Универсальная коллекция обеспечивает
строгую типизацию, так что в нее нельзя добавить другие типы
данных. При извлечении элемента из универсальной коллекции не
нужно определять или преобразовывать его тип данных.
4. Использование простой коллекции
• В примерах этого раздела используется универсальный классList<T>, который позволяет работать со строго типизированными
списками объектов.
• В приведенном ниже примере создается список строк, а затем
выполняется перебор строк с помощью оператора foreach.
• Оператор foreach позволяет перебирать строки
5. Пример
• // Create a list of strings.• var salmons = new List<string>();
• salmons.Add("chinook");
• salmons.Add("coho");
• salmons.Add("pink");
• salmons.Add("sockeye");
• // Iterate through the list.
• foreach (var salmon in salmons)
• {
Console.Write(salmon + " ");
• }
• // Output: chinook coho pink sockeye
6. Пример
• // Create a list of strings by using a• // collection initializer.
• var salmons = new List<string> { "chinook", "coho", "pink", "sockeye" };
• // Iterate through the list.
• foreach (var salmon in salmons)
•{
• Console.Write(salmon + " ");
•}
• // Output: chinook coho pink sockeye
7. Пример
• // Create a list of strings by using a• // collection initializer.
• var salmons = new List<string> { "chinook", "coho", "pink", "sockeye" };
• for (var index = 0; index < salmons.Count; index++)
•{
• Console.Write(salmons[index] + " ");
•}
• // Output: chinook coho pink sockeye
8. Виды коллекций
• Многие типовые коллекции предоставляются платформой.NET. Каждый тип коллекции предназначен для определенной
цели.
• Основные используемые классы коллекций:
Классы System.Collections.Generic
Классы System.Collections.Concurrent
Классы System.Collections
9.
КлассОписание
Пространства имен System.Collections.Generic
Dictionary<TKey,TValue> Предоставляет коллекцию пар «ключ-значение», которые упорядочены
по ключу.
List<T>
Представляет список объектов, доступных по индексу. Предоставляет
методы для поиска по списку, его сортировки и изменения.
Queue<T>
Представляет коллекцию объектов, которая обслуживается в порядке
поступления (FIFO).
SortedList<TKey,TValue> Представляет коллекцию пар "ключ-значение", упорядоченных по ключу
на основе реализации IComparer<T>.
Stack<T>
Представляет коллекцию объектов, которая обслуживается в обратном
порядке (LIFO).
10. Коллекции классов пространства имен System.Collections:
Коллекции классов пространстваимен System.Collections:
Класс Описание
ArrayList Представляет массив объектов, размер которого динамически
увеличивается по мере необходимости.
Hashtable Представляет коллекцию пар «ключ-значение», которые упорядочены
по хэш-коду ключа.
Queue
Представляет коллекцию объектов, которая обслуживается в порядке
поступления (FIFO).
Stack
Представляет коллекцию объектов, которая обслуживается в
обратном порядке (LIFO).
11. Пример:
12.
13. Пример:
14. Пример:
15. Использование LINQ для доступа к коллекции
16. Сортировка коллекции
17.
18. Определение настраиваемой коллекции
19.
20. Iterators
Итератор используется для выполнения настраиваемого перебора
коллекции. Итератор может быть методом или методом доступа get.
Итератор использует оператор yield return для возврата всех элементов
коллекции по одному за раз.
Итератор вызывается с помощью оператора foreach. Каждая
итерация цикла foreach вызывает итератор. При достижении оператора
yield return в итераторе возвращается выражение, и текущее
расположение в коде сохраняется. При следующем вызове итератора
выполнение возобновляется с этого места.
В приведенном ниже примере используется метод-итератор. Метод
итератора содержит оператор yield return, находящийся внутри цикла
for. В методе ListEvenNumbers каждая итерация тела оператора foreach
создает вызов метода-итератора, который переходит к следующему
оператору yield return.
21. Пример
• private static void ListEvenNumbers()• {
foreach (int number in EvenSequence(5, 18))
{
Console.Write(number.ToString() + " ");
}
Console.WriteLine();
// Output: 6 8 10 12 14 16 18
• }
• private static IEnumerable<int> EvenSequence(
int firstNumber, int lastNumber)
• {
// Yield even numbers in the range.
for (var number = firstNumber; number <= lastNumber; number++)
{
if (number % 2 == 0)
{
yield return number;
}
}
• }
22. Пример работы с коллекцией List
namespace Коллекции{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public List<double>
nums = new List<double> { 1, 2, 3, 4, 5 };
static private string ListToString<T>(List<T> list) => "{" + string.Join(", ",
23.
private void button1_Click(object sender, EventArgs e){
textBox2.Text = "";
textBox2.Text += "Список: " + ListToString(nums) + Environment.NewLine;
textBox2.Text += "Количество элементов в списке: "+
Convert.ToString(nums.Count) + Environment.NewLine;
textBox2.Text += "Вместимость списка: " +
Convert.ToString(nums.Capacity) + Environment.NewLine;
textBox2.Text +=
Environment.NewLine;
nums.Add(Convert.ToDouble(textBox1.Text));
textBox2.Text += "Список после добавления: " + ListToString(nums) +
Environment.NewLine;
}
24.
private void button2_Click(object sender, EventArgs e){
textBox2.Text = "";
textBox2.Text += "Список: " + ListToString(nums) + Environment.NewLine;
textBox2.Text += "Количество элементов в списке: " +
Convert.ToString(nums.Count) + Environment.NewLine;
textBox2.Text += "Вместимость списка: " + Convert.ToString(nums.Capacity) +
Environment.NewLine;
textBox2.Text += Environment.NewLine;
nums.Remove(Convert.ToDouble(textBox1.Text));
textBox2.Text += "Список после удаления: " + ListToString(nums) +
Environment.NewLine;
}
25.
private void button3_Click(object sender, EventArgs e){
textBox2.Text = "";
textBox2.Text += "Список: " + ListToString(nums) + Environment.NewLine;
textBox2.Text += "Количество элементов в списке: " + Convert.ToString(nums.Count)
+ Environment.NewLine;
textBox2.Text += "Вместимость списка: " + Convert.ToString(nums.Capacity) +
Environment.NewLine;
if (nums.Contains(Convert.ToDouble(textBox1.Text)) == true)
{
MessageBox.Show("Такой элемент имеется, он находится под индексом " +
Convert.ToString(nums.IndexOf(Convert.ToDouble(textBox1.Text))));
}
else MessageBox.Show("Такой элемент отсутствует");
}
26.
private void button4_Click(object sender, EventArgs e){
textBox2.Text = "";
textBox2.Text += "Список: " + ListToString(nums) + Environment.NewLine;
textBox2.Text += "Количество элементов в списке: " +
Convert.ToString(nums.Count) + Environment.NewLine;
textBox2.Text += "Вместимость списка: " + Convert.ToString(nums.Capacity)
+ Environment.NewLine;
textBox2.Text += Environment.NewLine;
nums.Sort();
textBox2.Text += "Список после сортировки: " + ListToString(nums) +
Environment.NewLine;
}