Глядя на ваш вопрос с высокого уровня, мне кажется, что вы действительно имеете дело со связанным списком, где каждый элемент указывает на следующий элемент.
Если это так, один из способовустановить «следующий» элемент для каждого элемента: сделать копию всех остановок, пройтись по исходному списку остановок, назначить ближайший экземпляр в списке на каждой итерации, а затем удалить этот элемент из списка, чтобыбольше не назначается:
List<DispatchStopModel> deliveries = deliveryService.GetYourDeliveries();
List<DispatchStopModel> temp = deliveries.ToList();
// Assuming you have a start location
DispatchStopModel start = GetStartingPoint();
// Assign the closest stop to it
FindClosestStop(start, deliveries);
// Now assign the closest delivery for each of the rest
// of the items, removing the closest item on each
// iteration, so it doesn't get assigned more than once.
foreach (var delivery in deliveries)
{
var closest = FindClosestStop(delivery, temp);
temp.Remove(closest);
}
После этого всем элементам следует присвоить NextDispatchID
, который указывает на следующую ближайшую точку доставки.Если вы все еще хотите «отсортировать» список, на этом сайте есть много ответов о том, как отсортировать связанный список (например, , например ).
Обратите внимание, что я сделалнебольшое изменение на FindClosestStop
, чтобы он возвращал ближайший найденный стоп:
private DispatchStopModel FindClosestStop(DispatchStopModel start,
ICollection<DispatchStopModel> stops)
{
DispatchStopModel closest = null;
// other code ommitted for brevity
if (distanceTo < start.Distance)
{
start.Distance = distanceTo;
start.NextDispatchID = stop.OrderDispatchID;
closest = stop;
}
// other code ommitted for brevity
return closest;
}
Также обратите внимание, что Equals
и GetHashCode
должны быть переопределены в классе DispatchStopModel
для метода Remove
дляработай.Если вы не хотите этого делать, вам нужно найти элемент с соответствующим значением OrderDispatchID
и удалить его таким образом.