public void Add(T data) { OWList <T> list = new OWList <T>(data); //Если последний элемент не определен, то это значит, что список еще не сформирован, так что добавленный элемент //является одновременно первым и последним. Иначе он становится новым последним. if (end == null) { this.data = data; start = this; end = this; } else { end.next = list; end = list; } //Если вместимость списка достигнута, то она удваивается. if (Count == Capacity) { Capacity *= 2; T[] temp = new T[Capacity]; Array.Copy(items, temp, Count); items = temp; } items[Count] = data; Count++; }
static void Main(string[] args) { /* Примечание: в этом проекте собраны результаты 5 лабораторных работ, которые помечены номерами. Все лабораторные * работы, кроме первой, сделаны на основе иерархии классов из первой работы. * Задание: * 1. Реализовать иерархию классов: * Person -> Employee -> Teacher * Person -> Student * Реализовать для каждого класса статическое поле Count, которое ведет подсчет количества объектов данного класса. * Для класса Person реализовать интерфейсы IComparable, ICloneable. * 2. Создать класс TestCollections, который содержит поля List<T>, List<string>, Dictionary<T, K>, Dictionary<string, K>, * где string - это результат применения метода ToString() к T, K - производный класс в иерархии классов, а T - * базовый класс, поля которого соответствуют полям класса K. * 3. Реализовать для класса Person коллекции: двунаправленный список и бинарное дерево. Реализовать методы: * добавление в двунаправленный список элемента по номеру и превращение идеально сбалансированного дерева в дерево * поиска. * Реализовать однонаправленный обобщенный список с конструкторами: OWList(), OWList(int capacity), OWList(OWList e). * Реализовать в нем методы для добавления одного или нескольких элементов, удаления элемента, поиска элемента, * клонирования коллекции, поверхностного копирования коллекции, удаления коллекции. Реализовать поле, * позволяющее получить текущее количество элементов. Реализовать интерфейсы IEnumerable и IEnumerator и перегрузить * индексатор. * 4. Создать класс PersonList, производный от класса List<Person>. Добавить в него методы для добавления и удаления * элементов и перегрузить индексатор. Добавить событие CountChanged, которое вызывается при изменении количества * элементов, и событие ReferenceChanged, которое вызывается при замене элемента коллекции. Для событий определить * делегат CollectionHandler(object source, CHEventArgs args), где CHEventArgs - класс, наследуемый от EventArgs, * содержащий сведения о имени коллекции, типе изменения и ссылку на элемент, с которым связаны изменения. * Создать класс JournalEntry, в который можно помещать данные из CHEventArgs, и класс Journal, который хранит * список элементов типа JournalEntry. Обеспечить возможность добавления в класс Journal элементов каждый раз, когда * вызывается событие класса PersonList. * 5. Заполнить обобщенную коллекцию из задания 3 элементами иерархии классов из задания 1. Выполнить запросы с * помощью LINQ: на выборку данных, на количество объектов с заданным условием, на аггрегацию данных. * Это задание выполнено ниже. */ OWList <Person> list = new OWList <Person>(15); Random rand = new Random(); for (int i = 0; i < 15; i++) { list.Add(new Person($"Mob{i + 1}", rand.Next(10, 81), (rand.Next(2) == 0) ? true : false)); } list.Show(); Console.WriteLine(); var youngsters = from person in list where person.Age < 40 select person; foreach (var c in youngsters) { Console.Write(c.ToString()); } Console.WriteLine("Amount of geezers: " + (from person in list where person.Age >= 60 select person).Count()); var gentlemen = from person in list where person.IsMale == true select person; var grandfathers = from person in list where person.Age >= 40 && person.IsMale == true select person; foreach (var c in grandfathers) { Console.Write(c.ToString()); } Console.WriteLine("Total age: " + (from person in list select person.Age).Aggregate((a, b) => a + b)); }
public bool Remove(T data) { //Если удаляется первый элемент и он один, список становится пустым. Иначе второй элемент становится новым первым. if (this != null && Equals(this.data, data)) { if (Count == 1) { this.data = default(T); start = null; end = null; RemoveFromArray(data); return(true); } else { this.data = next.data; next = next.next; RemoveFromArray(data); return(true); } } //Если удаляется последний элемент и он является вторым, то список становится списком из одного элемента. else if (this != null && Equals(end.data, data)) { var current = start; while (current.next != end) { current = current.next; } current.next = null; end = current; RemoveFromArray(data); return(true); } //Иначе ищется первый элемент и удаляется (если найден). else if (this != null) { var current = start; while (current.next != null) { if (Equals(current.next.data, data)) { current.next = current.next.next; RemoveFromArray(data); return(true); } current = current.next; } } //Если ничего из вышеперечисленного не подходит или в функцию передан null, то ничего не происходит и функция //возвращает false. return(false); }
public bool MoveNext() { if (current.next == null) { Reset(); return(false); } else { current = current.next; return(true); } }
public void Reset() { current = start; }
public OWListNumerator(OWList <T> c) { start.next = c.start; current.next = c.start; }
public OWList(OWList <T> collection) { Capacity = collection.Capacity; items = new T[Capacity]; Add(collection.items); }