public Ruta[] DameLineaComoRuta(string lineaCode) { var linea = LineaBC.DameLineas(lineaCode); var masCercanoOrigen = linea.Paraderos.First(); var masCercaDestino = linea.Paraderos.Last(); var detalle = DameDetalle(masCercanoOrigen, masCercaDestino, linea); return(new[] { new Ruta() { Detalle = detalle.ToArray() } }); }
private List <RutaDetalle> DameDetalle(Paradero origen, Paradero destino, Linea linea = null) { if (origen.Codigo == destino.Codigo) { return(new List <RutaDetalle>()); } Linea[] lineas; if (linea != null) { lineas = new[] { linea } } ; else { lineas = LineaBC.DameLineas(origen); } var distance = Distance.GetDistance(origen.Coordenada, destino.Coordenada); var paraderosMasCercanos = lineas .SelectMany(l => l.Paraderos.Select(p => new { Paradero = p, Linea = l, Distancia = Distance.GetDistance(p.Coordenada, destino.Coordenada) + Distance.GetDistance(p.Coordenada, origen.Coordenada) })) .Where(p => p.Paradero.Codigo != origen.Codigo && Distance.GetDistance(p.Paradero.Coordenada, destino.Coordenada) < distance) .OrderBy(p => p.Distancia) .ToArray(); if (getMinimal) { var list = new List <List <RutaDetalle> >(); foreach (var paraderoMasCercano in paraderosMasCercanos) { var rutaDetalle = DameDetalle(paraderoMasCercano.Paradero, destino); if (rutaDetalle == null) { continue; } var detalle = LineaARutaDetalle.DameDetalle(origen, paraderoMasCercano.Paradero, paraderoMasCercano.Linea); detalle.AddRange(rutaDetalle); list.Add(detalle); } return(list.OrderBy(p => p.Sum(d => d.Distancia)).First()); } else { foreach (var paraderoMasCercano in paraderosMasCercanos) { var rutaDetalle = DameDetalle(paraderoMasCercano.Paradero, destino); if (rutaDetalle == null) { continue; } var detalle = LineaARutaDetalle.DameDetalle(origen, paraderoMasCercano.Paradero, paraderoMasCercano.Linea); detalle.AddRange(rutaDetalle); return(detalle); } } return(new List <RutaDetalle>()); }