/// <summary>
        /// Меняет местами элементы массива.
        /// </summary>
        /// <typeparam name="T">Тип, с помощью которого в карточке путешествия задается пункт назначения.</typeparam>
        /// <param name="initialArray">Массив с карточками.</param>
        /// <param name="firstIndex">Индекс первого элемента.</param>
        /// <param name="secondIndex">Индекс второго элемента.</param>
        public static void Swap <T>(this TravelCard <T>[] initialArray, int firstIndex, int secondIndex)
        {
            if (firstIndex == secondIndex)
            {
                return;
            }
            TravelCard <T> t = initialArray[firstIndex];

            initialArray[firstIndex]  = initialArray[secondIndex];
            initialArray[secondIndex] = t;
        }
        /// <summary>
        ///     Метод формирует маршрут следования на основе набора карточек.
        ///		Реализован с помощью хештаблиц.
        /// </summary>
        /// <typeparam name="T">Тип, с помощью которого в карточке путешествия задается пункт назначения.</typeparam>
        /// <param name="cards">Произвольный набор карточек путешествия. В наборе не должно содержаться циклов.</param>
        public static IEnumerable <TravelCard <T> > GetTripPathFast <T>(this IList <TravelCard <T> > cards)
        {
            if (cards == null)
            {
                throw new ArgumentNullException(nameof(cards));
            }

            if (cards.Count < 2)
            {
                return(cards);
            }
            Dictionary <T, int> fromDictionary = new Dictionary <T, int>();
            Dictionary <T, int> toDictionary   = new Dictionary <T, int>();

            for (int i = 0; i < cards.Count; i++)
            {
                var curCard = cards[i];
                fromDictionary[curCard.From] = i;
                toDictionary[curCard.To]     = i;
            }

            var tailIndex = 0;

            for (int i = 0; i < cards.Count; i++)
            {
                tailIndex = i;
                var curCard = cards[i];
                if (!fromDictionary.ContainsKey(curCard.To))
                {
                    break;
                }
            }

            var result = new TravelCard <T> [cards.Count];

            var currentIndex = tailIndex;

            for (int i = result.Length - 1; i >= 0; i--)
            {
                var currentCard = cards[currentIndex];
                result[i] = currentCard;
                if (i != 0)
                {
                    currentIndex = toDictionary[currentCard.From];
                }
            }

            return(result);
        }
Exemple #3
0
 /// <summary>
 ///     Проверяет эквивалентность двух типизированных объектов.
 /// </summary>
 /// <param name="other">Объект с которым нужно сравнить.</param>
 /// <returns>Результат сравнения.</returns>
 protected bool Equals(TravelCard <T> other)
 {
     return(EqualityComparer <T> .Default.Equals(From, other.From) && EqualityComparer <T> .Default.Equals(To, other.To));
 }
Exemple #4
0
 /// <summary>
 ///     Является ли текущая карточка источником для другой.
 /// </summary>
 /// <param name="card">Карточка для которой нужно проверить правило.</param>
 /// <returns>Ture если является. False в противном случае.</returns>
 public bool IsTargetForCard(TravelCard <T> card)
 {
     return(EqualityComparer <T> .Default.Equals(To, card.From));
 }