[英]Improve LINQ query performance
假設有一堂課
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
列表之后,我想根據TripId
過濾StopTimes
。 在我的場景中,我在StopTime
列表中大約有8000個TripId
。
我試圖使用以下代碼創建列表的字典:
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個TripId實例。
但是,這是非常耗時的任務。 有沒有辦法提高性能?
聽起來您想要查找 :
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
一次即可。
我建議循環更改:經過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 });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.