public ObjectoDijkstra[] DameGrafos() { var list = LineaDA.GetInstance().lineas.SelectMany(l => LineaARutaDetalle.DameDetalle(l.Paraderos.First(), l.Paraderos.Last(), l)).ToList(); list.AddRange(LineaDA.GetInstance().lineas.SelectMany(l => LineaARutaDetalle.DameDetalle(l.Paraderos.Last(), l.Paraderos.First(), l)).ToList()); var lista2 = list .GroupBy(l => l.ParaderoOrigen.Codigo + "/" + l.ParaderoDestino.Codigo) .Select(k => k.First()) .ToArray(); return(lista2 .GroupBy(l => l.ParaderoOrigen.Codigo) .Select(k => new ObjectoDijkstra { Origen = k.First().ParaderoOrigen, Destinos = k.Select(d => new Dijkstra { Destino = d.ParaderoDestino, Distancia = d.Distancia }).ToArray() }).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>()); }