Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 131 132 133 134 135 136 137 138 139 ... 407
FirstName {get; set;}

    public string LastName {get; set;}

    public Person(){}

    public Person(string firstName, string lastName, int age)

    {

      Age = age;

      FirstName = firstName;

      LastName = lastName;

    }

    public override string ToString()

    {

      return $"Name: {FirstName} {LastName}, Age: {Age}";

    }

  }

}

Удалите сгенерированный код из файла Program.cs и добавьте следующие операторы using:

using System;

using System.Collections.Generic;

using FunWithGenericCollections;

Первым будет исследоваться обобщенный класс List<T>, который уже применялся ранее в главе. Класс List<T> используется чаще других классов из пространства имен System.Collections.Generic, т.к. он позволяет динамически изменять размер контейнера. Чтобы ознакомиться с его особенностями, добавьте в класс Program метод UseGenericList(), в котором задействован класс List<T> для манипулирования набором объектов Person; вспомните, что в классе Person определены три свойства (Age, FirstName и LastName), а также специальная реализация метода ToString():

static void UseGenericList()

{

  // Создать список объектов Person и заполнить его с помощью

  // синтаксиса инициализации объектов и коллекции.

  List<Person> people = new List<Person>()

  {

    new Person {FirstName= "Homer", LastName="Simpson", Age=47},

    new Person {FirstName= "Marge", LastName="Simpson", Age=45},

    new Person {FirstName= "Lisa", LastName="Simpson", Age=9},

    new Person {FirstName= "Bart", LastName="Simpson", Age=8}

  };

  // Вывести количество элементов в списке.

  Console.WriteLine("Items in list: {0}", people.Count);

  // Выполнить перечисление по списку.

  foreach (Person p in people)

  {

    Console.WriteLine(p);

  }

  // Вставить новый объект Person.

  Console.WriteLine("n->Inserting new person.");

  people.Insert(2, new Person { FirstName = "Maggie",

                                LastName = "Simpson", Age = 2 });

  Console.WriteLine("Items in list: {0}", people.Count);

  // Скопировать данные в новый массив.

  Person[] arrayOfPeople = people.ToArray();

  foreach (Person p in arrayOfPeople)  // Вывести имена

  {

    Console.WriteLine("First Names: {0}", p.FirstName);

  }

}

Здесь для наполнения списка List<T> объектами применяется синтаксис инициализации в качестве сокращенной записи многократного вызова метода Add(). После вывода количества элементов в коллекции (и прохода по всем элементам) вызывается метод Insert(). Как видите, метод Insert() позволяет вставлять новый элемент в List<T> по указанному индексу.

Наконец, обратите внимание на вызов метода ToArray(), который возвращает массив объектов Person, основанный на содержимом исходного списка List<T>. Затем осуществляется проход по всем элементам данного массива с использованием синтаксиса индексатора массива. Вызов метода UseGenericList() в операторах верхнего уровня приводит к получению следующего вывода:

***** Fun with Generic Collections *****

Items in list: 4

Name: Homer Simpson, Age: 47

Name: Marge Simpson, Age: 45

Name: Lisa Simpson, Age: 9

Name: Bart Simpson, Age: 8

->Inserting new person.

Items in list: 5

First Names: Homer

First Names: Marge

First Names: Maggie

First Names: Lisa

First Names: Bart

В классе List<T> определено множество дополнительных членов, представляющих интерес, поэтому за полным их описанием обращайтесь в документацию. Давайте рассмотрим еще несколько обобщенных коллекций, в частности Stack<T>, Queue<T> и SortedSet<T>, что должно способствовать лучшему пониманию основных вариантов хранения данных в приложении.

Работа с классом Stack<T>

Класс Stack<T> представляет коллекцию элементов, которая обслуживает элементы в стиле "последний вошел — первый вышел" (LIFO). Как и можно было ожидать, в Stack<T> определены члены Push() и Pop(), предназначенные для вставки и удаления элементов из стека. Приведенный ниже метод создает стек объектов Person:

static void UseGenericStack()

{

  Stack<Person> stackOfPeople = new();

  stackOfPeople.Push(new Person { FirstName = "Homer",

                                  LastName = "Simpson", Age = 47 });

  stackOfPeople.Push(new Person { FirstName = "Marge",

                                  LastName = "Simpson", Age = 45 });

  stackOfPeople.Push(new Person { FirstName = "Lisa",

                                  LastName = "Simpson", Age = 9 });

  // Просмотреть верхний элемент, вытолкнуть его и просмотреть снова..

  Console.WriteLine("First person is: {0}", stackOfPeople.Peek());

  Console.WriteLine("Popped off {0}", stackOfPeople.Pop());

  Console.WriteLine("nFirst person is: {0}", stackOfPeople.Peek());

  Console.WriteLine("Popped off {0}", stackOfPeople.Pop());

  Console.WriteLine("nFirst person item is: {0}", stackOfPeople.Peek());

  Console.WriteLine("Popped off {0}", stackOfPeople.Pop());

  try

  {

    Console.WriteLine("nnFirst person is: {0}", stackOfPeople.Peek());

    Console.WriteLine("Popped off {0}", stackOfPeople.Pop());

  }

  catch (InvalidOperationException ex)

  {

    Console.WriteLine("nError! {0}", ex.Message);  // Ошибка! Стек пуст

  }

}

В коде строится стек, который содержит информацию о трех лицах, добавленных в алфавитном порядке следования их имен: Homer, Marge и Lisa. Заглядывая (посредством метода Реек()) в стек, вы будете всегда видеть объект, находящийся на его вершине; следовательно, первый вызов Реек() возвращает третий объект Person. После серии вызовов Pop() и Peek() стек, в конце концов, опустошается, после чего дополнительные вызовы Реек() и Pop() приводят к генерации системного исключения. Вот как выглядит вывод:

***** Fun with Generic Collections *****

First person is: Name: Lisa Simpson, Age: 9

Popped off Name: Lisa Simpson, Age: 9

First person is: Name: Marge Simpson, Age: 45

Popped off Name: Marge Simpson, Age: 45

First person item is: Name: Homer Simpson, Age: 47

Popped off Name: Homer Simpson, Age: 47

Error! Stack empty.

Работа с классом Queue<T>

Очереди — это контейнеры, которые обеспечивают доступ к элементам в стиле "первый вошел — первый вышел" (FIFO). К сожалению, людям приходится сталкиваться с очередями практически ежедневно: в банке, в супермаркете, в кафе. Когда нужно смоделировать сценарий, в котором элементы обрабатываются в режиме FIFO, класс Queue<T> подходит наилучшим образом. Дополнительно к функциональности, предоставляемой

1 ... 131 132 133 134 135 136 137 138 139 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий