Реализация IEnumerator в списках. - C#

Узнай цену своей работы

Формулировка задачи:

Вопрос заключается в реализации IEnumerator и его друзей в циклическом двусвязном списке, созданном вручную. Иными словами, как сделать возможным foreach в двусвязном списке с помощью этого интерфейса? Возникла проблема объявления массивов. При объявлении массива предметов в классе собственно этого списка требуется так или иначе указать количество элементов. Если указать потенциальное максимальное количество, например 100, то после использования IEnumerator как здесь, foreach пробегает по 100 элементам. Например если создать некий итератор и выводить его, начиная с 1 и увеличивая на 1, то будут выведены числа от 1 до 100. А если обращаться к неким данным из списка, то когда цикл дойдёт до пустого элемента, который по умолчанию null, естественно произойдёт ошибка. Можно ли как-то динамически изменять длину массива, ну или какие ещё методы решения можете посоветовать?

Решение задачи: «Реализация IEnumerator в списках.»

textual
Листинг программы
using System;
using System.Collections;
using System.Collections.Generic;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
 
            MyList list = new MyList();
            list.Add( new Node { Name = "node1" } );
            list.Add( new Node { Name = "node2" } );
            list.Add( new Node { Name = "node3" } );
            list.Add( new Node { Name = "node4" } );
 
            foreach ( var node in list ) {
                Console.WriteLine( node.Name );
            }
 
            Console.ReadKey();
        }
    }
 
    public class MyList : IEnumerable<Node> {
        public Node Windows { get; private set; }
        public Node Header { get; set; }
 
        #region IEnumerable<Node> Members
 
        public IEnumerator<Node> GetEnumerator() {
            Node curr = Header;
            yield return curr;
            do {
                curr = curr.Next;
                yield return curr;
            }
            while ( curr.Next != Header );
        }
 
        IEnumerator IEnumerable.GetEnumerator() {
            return GetEnumerator();
        }
 
        #endregion
 
        public void Add( Node node ) {
            if ( Header == null ) {
                Windows = Header = node;
                node.Next = node;
                node.Previous = node;
            }
            else {
                Node curr = Windows;
                Windows = node;
                node.Next = Header;
                node.Previous = curr;
                curr.Next = node;
            }
        }
    }
 
    public class Node {
        public string Name { get; set; }
        public Node Next { get; set; }
        public Node Previous { get; set; }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5