예제 #1
0
        public static LinkedListNode <T> PrivateUpdate <T, TUpdate>(this LinkedList <T> list, LinkedListNode <T> node, IStrictComparer <TUpdate> comparer) where T : TUpdate
        {
#endif
            Debug.Assert(node.List == list);
            var item = node.Value;
            LinkedListNode <T> next;
            LinkedListNode <T> previous;
            var isMoving = false;

            // if lower then go down
            previous = node;
            next     = node.Next;
            while (next != null && comparer.IsBetter(item, next.Value))
            {
                isMoving = true;
                previous = next;
                if (next.Next == null)
                {
                    break;
                }
                next = next.Next;
            }

            if (isMoving)
            {
                list.Remove(node);
                list.AddAfter(previous, node);
                return(node);
            }

            // if higher then go up
            next = node.Previous;
            while (next != null && !comparer.IsBetter(item, next.Value))
            {
                isMoving = true;
                previous = next;
                if (next.Previous == null)
                {
                    break;
                }
                next = next.Previous;
            }

            if (isMoving)
            {
                list.Remove(node);
                list.AddBefore(previous, node);
                return(node);
            }

            return(node);
        }
예제 #2
0
        public static LinkedListNode <T> Insert <T, TInsert>(this LinkedList <T> list, T item, IStrictComparer <TInsert> comparer) where T : TInsert
        {
            var current = list.First;

            // we look for the first order that has less value
            while (current != null && comparer.IsBetter(item, current.Value))
            {
                current = current.Next;
            }
            // happends in case it is empty or order should be last of the list
            return(current == null?list.AddLast(item) : list.AddBefore(current, item));
        }
예제 #3
0
        public static LinkedListNode <T> Update <T, TUpdate>(this LinkedList <T> list, LinkedListNode <T> node, IStrictComparer <TUpdate> comparer) where T : TUpdate
        {
#if DEBUG
            PrivateUpdate(list, node, comparer);

            LinkedListNode <T> item = list.First;
            while (item != null)
            {
                var previous = item.Previous;
                if (previous != null)
                {
                    Debug.Assert(!comparer.IsBetter(previous.Value, item.Value));
                }
                item = item.Next;
            }

            return(node);
        }