Verbessern Sie die Leistung von LINQ-Abfragen

Angenommen, es gibt eine Klasse

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; }
}

Ich muss Daten aus einer CSV-Datei lesen und sie der genannten Klasse zuordnen. Die CSV-Datei kann viele Datensätze haben, in meinem Fall etwa 500000 Datensätze.

Nachdem ich die CSV-Datei und die Kartendaten in einer Liste von StopTime in verschiedenen Funktionen analysiert habe, möchte ich StopTimes basierend auf TripId filtern. In meinem Szenario habe ich etwa 8000 TripId in der Liste von StopTime .

Ich habe versucht, ein Dictionary einer Liste mit diesem Code zu erstellen:

var TripIdStops = new Dictionary>();

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

Um das Wörterbuch zu erstellen, muss diese Schleife StopTime s filtern, 500000 Datensätze und 8000 Instanzen von TripIds merken.

Dies ist jedoch eine sehr zeitaufwendige Aufgabe. Gibt es eine Möglichkeit, die Leistung zu verbessern?

0

3 Antworten

Es klingt, als ob Sie eine Suche möchten :

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

Oder um es zunächst durch ListOfTripId einzugrenzen:

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

In beiden Fällen müssen Sie nur einmal StopTimes durchlaufen.

0
hinzugefügt

Sie können stattdessen eine Tabelle Suche erstellen .

Repräsentiert eine Sammlung von Schlüsseln, die jeweils einem oder mehreren Werten zugeordnet sind.

var lookup = StopTimes.ToLookup(st => st.TripId);
0
hinzugefügt

Ich habe einen Loopwechsel vorgeschlagen: gehe durch StopTimes , etwas so was:

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
hinzugefügt