Mejora el rendimiento de consultas LINQ

Asumiendo que hay una clase

public class StopTime
{
    public TimeSpan? ArrivalTime { get; set; }
    public TimeSpan? DepartureTime { get; set; }
    public string StopID { get; set; }
    public int StopSequence { get; set; }
    public string TripID { get; set; }
}

Debo leer los datos de un archivo CSV y asignarlos a la clase mencionada. El archivo CSV puede tener muchos registros, en mi caso aproximadamente 500000 registros.

Después de analizar el archivo CSV y los datos del mapa para listar StopTime en diferentes funciones, quiero filtrar StopTimes en función de TripId . En mi caso, tengo cerca de 8000 TripId s en la lista de StopTime .

Intenté crear un diccionario de una lista usando este código:

var TripIdStops = new Dictionary>();

foreach (var tripId in ListOfTripId)
{
    TripIdStops.Add(tripId, StopTimes.Where(x=>x.TripID==tripsDistinct).ToList());
}

Para crear el diccionario, este ciclo debe filtrar StopTime s, recordar 500000 registros y 8000 instancias de TripIds.

Sin embargo, esta es una tarea que consume mucho tiempo. ¿Hay alguna forma de mejorar el rendimiento?

0

3 Respuestas

Parece que desea una búsqueda :

var stopTimesByTripId = StopTimes.ToLookup(st => st.TripId);

O para reducirlo primero por ListOfTripId :

var tripIdSet = new HashSet(ListOfTripId);
var stopTimesByTripId = StopTimes.Where(st => tripIdSet.Contains(st.TripId))
                                 .ToLookup(st => st.TripId);

En ambos casos, solo necesitará iterar a través de StopTimes una vez.

0
agregado

En su lugar, puede crear una tabla de búsqueda .

Representa una colección de claves, cada una asignada a uno o más valores.

var lookup = StopTimes.ToLookup(st => st.TripId);
0
agregado

He sugerido el cambio de bucle: pasar por StopTimes , algo Me gusta esto:

var TripIdStops = new Dictionary>();

foreach (var time in StopTimes) {
  List list;

  if (TripIdStops.TryGetValue(time.TripID, out list))
    list.Add(time);
  else
    TripIdStops.Add(time.TripID, new List() { time });
}
0
agregado