Поодиночке-связанный список очереди


Недавно я узнал ядра .Чистая Queue тип использует массивы внутренне, и что это на самом деле гораздо более эффективным. Я решила написать поодиночке-связанный список версия очереди, MyQueue.

Запуск простого секундомера раз против этого .Чистый тип показывает разницу 50мс при очереди более 1 миллиона экземпляров и проверяя длину.

Как его можно улучшить?

MyQueueNode

namespace MyQ.Core
{
    public class MyQueueNode<T> : IMyQueueNode<T>
    {
        private MyQueueNode<T> _nextNode;

        private T _value;

        public MyQueueNode(T value)
        {
            _value = value;
        }

        public void SetNextNode(ref MyQueueNode<T> nextNode)
        {
            _nextNode = nextNode;
        }

        public MyQueueNode<T> GetNextNode()
        {
            return _nextNode;
        }

        public T GetValue()
        {
            return _value;
        }
    }
}

Моя_очередь

namespace MyQ.Core
{
    public class MyQueue<T> : IMyQueue<T> where T : class
    {
        private volatile MyQueueNode<T> _headNode, _tailNode;

        public void Enqueue(T item)
        {
            MyQueueNode<T> newNode = new MyQueueNode<T>(item);

            if (_headNode == null)
            {
                _headNode = newNode;
                _tailNode = _headNode;
            }
            else
            {
                _tailNode.SetNextNode(ref newNode);
                _tailNode = newNode;
            }

            _length++;
        }

        public T Dequeue()
        {
            if(_headNode == null)
            {
                throw new QueueEmptyException();
            }

            T value = _headNode.GetValue();

            _headNode = _headNode.GetNextNode();

            _length--;

            return value;
        }

        public T Peek()
        {
            if(_headNode == null)
            {
                return null;
            }

            return _headNode.GetValue();
        }

        private long _length = 0;

        public long Length => _length;
    }
}


196
2
задан 30 марта 2018 в 11:03 Источник Поделиться
Комментарии
2 ответа

MyQueueNode:


  • где IMyQueueNode<T>?

  • _value можно сделать readonly

  • нет необходимости MyQueueNode быть public. Необходимо ограничить его доступ модификатор как можно больше. Клиенты не должны видеть ваши внутренности очереди.

  • в SetNextNode нет необходимости для передачи аргумента по ссылке

Моя_очередь:


  • QueueEmptyException не определено.

  • Peek метод возвращает null на пустой очереди. Что делать, если нет null как данные значения? Вы могли бы рассмотреть исключение как видно Dequeue и позволить пользователю проверить очередь проверить его длину до Peek называется.

  • вместо:

    private long _length = 0;
    public long Length => _length;

    вы могли бы рассмотреть комфортного использования авто собственность (и изменение ссылок на _length):

    public long Length { get; private set; }

1
ответ дан 10 апреля 2018 в 06:04 Источник Поделиться

Не используйте летучие в ниже линии

    private volatile MyQueueNode<T> _headNode, _tailNode;

Ссылка https://www.infoworld.com/article/3229360/application-development/how-to-use-the-volatile-keyword-in-c.html

0
ответ дан 10 апреля 2018 в 05:04 Источник Поделиться