/// <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); }
/// <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)); }
/// <summary> /// Является ли текущая карточка источником для другой. /// </summary> /// <param name="card">Карточка для которой нужно проверить правило.</param> /// <returns>Ture если является. False в противном случае.</returns> public bool IsTargetForCard(TravelCard <T> card) { return(EqualityComparer <T> .Default.Equals(To, card.From)); }