2013-12-17 4 views
0

Предполагая, что существует классУлучшение производительности запросов LINQ

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

Я должен считывать данные из файла CSV и отобразить его в указанном классе. Файл CSV может иметь много записей, в моем случае около 500000 записей.

После того, как я разобрал CSV-файл и данные карты в список StopTime в разных функциях, я хочу фильтровать StopTimes на основе TripId. В моем сценарии у меня около 8000 TripId s в списке StopTime.

Я попытался создать словарь из списка, используя этот код:

var TripIdStops = new Dictionary<string, List<StopTime>>(); 

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

Чтобы создать словарь, этот цикл должен фильтровать StopTime с, помните 500000 записей и 8000 экземпляров TripIds.

Однако это очень трудоемкая задача. Есть ли способ улучшить производительность?

ответ

2

Это звучит, как вы хотите lookup:

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

Или сужать его вниз ListOfTripId первым:

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

В обоих случаях вам нужно только перебирать StopTimes один раз.

1

Вместо этого вы можете создать таблицу lookup.

Представляет собой набор ключей, каждый из которых сопоставляется одному или нескольким значениям.

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

Я предложил изменить цикл: пройти через StopTimes, что-то вроде этого :

var TripIdStops = new Dictionary<string, List<StopTime>>(); 

foreach (var time in StopTimes) { 
    List<StopTime> list; 

    if (TripIdStops.TryGetValue(time.TripID, out list)) 
    list.Add(time); 
    else 
    TripIdStops.Add(time.TripID, new List<StopTime>() { time }); 
} 
Смежные вопросы